lodash计算字段的唯一值数量

12

我有一个包含500个对象的数组,每个对象看起来像这样:

{name: 'Hello', phone_num: '1234'}

现在我希望找出每个名称的数量。因此,我希望将我的数组转换为以下内容:

[{name: 'Hello', count:15}, {name:'Marc', count:5}]

我希望使用lodash来解决这个问题,但在查看它们的文档时,我没有找到答案。

他们有一个叫做countBy的东西,但似乎不足以解决这个问题。

有人能帮助我吗?


所以您只想为每个对象添加计数属性,而不是分组任何内容? - dfsq
1
_.countBy(your_data, 'name') - Alexey Ten
3个回答

19
你可以利用 groupBy() 函数按名称分组,然后对每个分组的项使用 map() 函数返回所需的计数和名称。
var result = _(data)
  .groupBy('name')
  .map((items, name) => ({ name, count: items.length }))
  .value();

var data = [
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  { name: 'Hello', phone_num: '1234'},
  
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  { name: 'Marc', phone_num: '5432'},
  
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'},
  { name: 'Sam', phone_num: '76532'}
  
];
  
var result = _(data)
  .groupBy('name')
  .map((items, name) => ({ name, count: items.length }))
  .value();
  
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"></script>

更新:

ES5版本为:

var result = _(data)
  .groupBy('name')
  .map(function(items, name) { 
     return { name: name, count: items.length };
  }).value();

这意味着你使用JavaScript的环境不兼容ES6箭头函数,让我添加ES5版本。 - ryeballar
"{name}" 是否等于 "{name: name}"?这个叫什么?你能给一个规范链接吗? - vp_arth
1
@vp_arth 请查看增强对象字面量 - ryeballar
"{[a]: true}" 是一个杀手级功能 :) - vp_arth
我之前不知道可以将lodash作为构造函数(_(data))使用。文档中好像没有提到过。它是将js对象和数组转换为lodash对象,以便我可以链式调用函数,而不是将js对象或数组作为参数传递吗? - Wish
1
@Wish 这在文档中有说明。 - ryeballar

11
抱歉,我目前只能使用英语回答问题。
var result = _(data)
  .countBy('name')
  .map((count, name) => ({ name, count }))
  .value();

这比我的解决方案好多了。+1。 - ryeballar
@MarcRasmussen 可能你需要将它从ES6重写为ES5。 - Alexey Ten

2

你可以使用:

const data = [{name: 'Hello', phone:15}, {name:'Marc', phone:5}, {name: 'Hello', phone:10}];
const names = _.countBy(data, 'name');

Object.keys(names).map(x => ({name: x, count: names[x]}));

ES5 代码:

var data = [{name: 'Hello', phone:15}, {name:'Marc', phone:5}, {name: 'Hello', phone:10}];
var names = _.countBy(data, 'name');

Object.keys(names).map(function(x) {
  return {
    name: x,
    count: names[x]
  };
});

然后,您可以将Object.keys调用的返回值分配给变量或对其进行任何操作


那是ES2015箭头函数,它在新的(不是很新的)JS版本中。我会编辑答案以添加ES5版本。 - Felipe Skinner
箭头函数 - vp_arth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接