使用 Node 或 ES6 从 JSON 中过滤记录

Posted

技术标签:

【中文标题】使用 Node 或 ES6 从 JSON 中过滤记录【英文标题】:Filter Records from JSON with Node or ES6 【发布时间】:2016-10-14 15:36:42 【问题描述】:

我不确定解决此问题的最佳方法。例如,我想迭代我的json 并查找所有在美国的公司。随着我的应用程序的增长,这个JSON 可能会变得更加复杂,例如在关卡、对象等方面。我只想知道人们使用JSONNode.js 过滤掉数据子集的简单搜索和/或ES6 或库,例如Lodash 等。

例如这个 json,我有什么方法可以搜索它并只撤回美国的那些公司?

[
    "id": 0,
    "name": "Company1",
    "logoUrl": "/lib/assets/company1-logo.png",
    "location":
      "country": "USA",
      "state": "California",
      "city": "Napa"
    ,
    "active": false
  ,
  
    "id": 1,
    "name": "Company2",
    "logoUrl": "/lib/assets/company2-logo.png",
    "location":
      "country": "Germany",
      "state": "",
      "city": "Berlin"
    ,
    "active": false
  ,
  
    "id": 2,
    "name": "Company3",
    "logoUrl": "/lib/assets/company3-logo.png",
    "location":
      "country": "USA",
      "state": "Michigan",
      "city": "Detroit"
    ,
    "active": false
  ]

【问题讨论】:

是的,我知道,但你可以在没有 ES6 的情况下使用节点,我只是说如果你愿意,请使用 ES6,无论哪种方式都没有关系,只是想办法过滤这个 换句话说使用节点中间件来帮助过滤,或者使用普通的JS方法,或者使用你想要的任何想法或建议使用花哨的ES6 【参考方案1】:

您可以使用原生过滤功能。

const items = [
    "id": 0,
    "name": "Company1",
    "logoUrl": "/lib/assets/company1-logo.png",
    "location":
      "country": "USA",
      "state": "California",
      "city": "Napa"
    ,
    "active": false
  ,
  
    "id": 1,
    "name": "Company2",
    "logoUrl": "/lib/assets/company2-logo.png",
    "location":
      "country": "Germany",
      "state": "",
      "city": "Berlin"
    ,
    "active": false
  ,
  
    "id": 2,
    "name": "Company3",
    "logoUrl": "/lib/assets/company3-logo.png",
    "location":
      "country": "USA",
      "state": "Michigan",
      "city": "Detroit"
    ,
    "active": false
  ]

const usItems = items.filter(v => v.location.country === 'USA')

【讨论】:

【参考方案2】:

您可以使用 javascript 的简单 .filter() 方法返回满足过滤器的结果列表。假设您的数据在可变数据中

ES5

data.filter(function(item) 
  return item.location.country === 'USA';
);

ES6:在 ES6 中,您可以使用箭头函数与

data.filter((item) => 
  return item.location.country === 'USA';
);

var data = [
    "id": 0,
    "name": "Company1",
    "logoUrl": "/lib/assets/company1-logo.png",
    "location":
      "country": "USA",
      "state": "California",
      "city": "Napa"
    ,
    "active": false
  ,
  
    "id": 1,
    "name": "Company2",
    "logoUrl": "/lib/assets/company2-logo.png",
    "location":
      "country": "Germany",
      "state": "",
      "city": "Berlin"
    ,
    "active": false
  ,
  
    "id": 2,
    "name": "Company3",
    "logoUrl": "/lib/assets/company3-logo.png",
    "location":
      "country": "USA",
      "state": "Michigan",
      "city": "Detroit"
    ,
    "active": false
  ];

var res1 = data.filter(function(item) 
  return item.location.country === 'USA';
);

const res2 = data.filter((item) => 
  return item.location.country === 'USA';
);

console.log(res1);
console.log(res2);

【讨论】:

【参考方案3】:

在lodash中会是

_.filter(data, function(item) 
  return item.location.country === 'USA';
);

【讨论】:

【参考方案4】:

使用 JavaScript 原生 Array#filter 方法和 ES6 arrow function

var res = data.filter(v => v.location.country === 'USA');

var data = [
  "id": 0,
  "name": "Company1",
  "logoUrl": "/lib/assets/company1-logo.png",
  "location": 
    "country": "USA",
    "state": "California",
    "city": "Napa"
  ,
  "active": false
, 
  "id": 1,
  "name": "Company2",
  "logoUrl": "/lib/assets/company2-logo.png",
  "location": 
    "country": "Germany",
    "state": "",
    "city": "Berlin"
  ,
  "active": false
, 
  "id": 2,
  "name": "Company3",
  "logoUrl": "/lib/assets/company3-logo.png",
  "location": 
    "country": "USA",
    "state": "Michigan",
    "city": "Detroit"
  ,
  "active": false
];

var res = data.filter(v => v.location.country === 'USA');

console.log(res);

【讨论】:

该死的,这比我想象的要容易

以上是关于使用 Node 或 ES6 从 JSON 中过滤记录的主要内容,如果未能解决你的问题,请参考以下文章

Node v13 / Jest / ES6 — 原生支持没有 babel 或 esm 的模块

将 Node.js 项目从普通 ES6 迁移到 TypeScript

在 ES6 中过滤或映射节点列表

(ES6)使用输入字段过滤数据(min.array)

将 JSON 映射到 ES6 类

如果 `redux` 不在 package.json 或 package-lock.json 或 node_modules 中,为啥从 'redux' 导入任何东西仍然有效?