【问题标题】:lodash count unique of fieldlodash 字段的唯一计数
【发布时间】:2016-05-20 13:15:59
【问题描述】:

我有一个包含 500 个对象的数组,每个对象如下所示:

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

现在我想知道每个名字有多少个。所以我希望将我的数组转换为以下内容:

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

所以我希望考虑为此使用lodash,但查看他们的文档我无法找到答案。

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

谁能帮帮我?

【问题讨论】:

  • 所以你只想为每个对象添加计数属性,而不是对任何东西进行分组?
  • _.counBy(your_data, 'name')?

标签: javascript arrays lodash


【解决方案1】:

您可以使用 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>');
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.12.0/lodash.js"&gt;&lt;/script&gt;

更新:

ES5 版本将是:

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

【讨论】:

  • 表示你使用javascript的环境不兼容ES6箭头函数,我补充一下ES5版本。
  • {name} 是否等于 {name: name}?这个怎么称呼?能给个规范的链接吗?
  • @vp_arth 检查enhanced object literals
  • 谢谢){[a]: true} 是杀手级功能:)
  • @Wish 在documentation.
【解决方案2】:

我的版本:

var result = _(data)
  .countBy('name')
  .map((count, name) => ({ name, count }))
  .value();

【讨论】:

  • 这比我的解决方案好很多。 +1。
  • @MarcRasmussen 可能你必须将它从 es6 重写为 es5
【解决方案3】:

你可以使用:

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 调用的返回分配给一个 var 或用它做任何您想做的事情

【讨论】:

  • 这是 ES2015 的箭头函数,它在新的(不是那么新的)JS 版本上。我也将编辑答案以添加 ES5 版本
猜你喜欢
  • 2018-08-25
  • 2012-07-02
  • 2017-01-08
  • 1970-01-01
  • 2010-12-09
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多