【问题标题】:Find the number of occurrences of items in list inside a JSON查找 JSON 内列表中项目的出现次数
【发布时间】:2018-04-24 19:53:18
【问题描述】:

我一直在关注 JSON,我拥有他们的汽车制造商。在 lodash 中是否有更好的方法可以从预定义的列表中获取汽车制造商的数量。

例如,

{
    "data": [
        {"ownerId":"00001", "make": "Honda"},
        {"ownerId":"00002", "make": "Nissan"},
        {"ownerId":"00003", "make": "Audi"},
        {"ownerId":"00004", "make": "Porsche"},
        {"ownerId":"00005", "make": "Honda"},
        {"ownerId":"00006", "make": "Honda"},
        {"ownerId":"00007", "make": "Audi"},
        {"ownerId":"00008", "make": "Volkswagen"},
        {"ownerId":"00009", "make": "Honda"},
        {"ownerId":"00010", "make": "Porsche"},
        {"ownerId":"00011", "make": "Volkswagen"}
    ]
}

计算计数的过滤器列表:

["Honda", "Audi", "Porsche"]

预期结果:

[{"Audi": 2}, {"Honda": 4}, {"Porsche": 2}]

输入 JSON 中有其他汽车制造商但未考虑,因为过滤器列表没有它。

【问题讨论】:

  • 您需要对其进行调整,因为您的密钥是 make,所以没有解决方案是复制/粘贴
  • 我知道@LawrenceCherone,但我相信给定的解决方案已经过时了。似乎给出的答案是我所需要的。当我使用需要处理的实际 JSON 时存在一些问题。当我发现它有效时会接受答案。

标签: json lodash


【解决方案1】:

您可以使用_.countBy() 获取每个品牌的计数对象,然后使用_.pick() 获取您想要的项目:

const cars = {"data":[{"ownerId":"00001","make":"Honda"},{"ownerId":"00002","make":"Nissan"},{"ownerId":"00003","make":"Audi"},{"ownerId":"00004","make":"Porsche"},{"ownerId":"00005","make":"Honda"},{"ownerId":"00006","make":"Honda"},{"ownerId":"00007","make":"Audi"},{"ownerId":"00008","make":"Volkswagen"},{"ownerId":"00009","make":"Honda"},{"ownerId":"00010","make":"Porsche"},{"ownerId":"00011","make":"Volkswagen"}]};

const list = ["Honda", "Audi", "Porsche"];

const result = _.pick(_.countBy(cars.data, 'make'),  ["Honda", "Audi", "Porsche"]);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

【讨论】:

  • 这个解决方案非常适合我提出的问题。如果我将“法拉利”添加到“列表”并且汽车中不存在,有什么方法可以将计数设为 0?
  • 代替pick,你可以得到reduce列表,从对象中获取计数,如果计数不存在,赋值0代替:const result = list.reduce((r, make) => { r[make] = counts[make] || 0; return r; }, {});
  • 以下代码似乎对我有用,默认 0 值。 const result = _(cars).countBy('make').pick(list).defaults(_(list).mapKeys().mapValues(function() { return 0; }).value());
  • 我对 lodash 很陌生。你知道_之间的区别吗?和_()?
猜你喜欢
  • 2020-04-19
  • 2011-10-22
  • 2012-07-31
  • 2023-03-19
  • 2016-03-30
  • 2021-11-28
  • 1970-01-01
  • 2011-10-16
相关资源
最近更新 更多