如何计算数组中的相同对象属性值

iam*_*in. 3 javascript arrays

我有一个大型数组,具有以下结构:

let data = [
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name2',
    values: {...},
  },
  {
    name: 'name1',
    values: {...},
  },
  {
    name: 'name3',
    values: {...},
  },
  ...
]
Run Code Online (Sandbox Code Playgroud)

我需要找到一种方法来计算每个名称在数据数组中作为名称值出现的频率.

因此,在此示例中,结果应如下所示:

let nameCounts = [
  {
     name: 'name1'
     count: 3
  },
  {
     name: 'name2'
     count: 1
  },
  {
     name: 'name3'
     count: 1
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在努力为这个问题找到好办法.有任何想法吗?

sli*_*der 7

您可以reduce将数组转换为名称为键并将"计数对象"作为值的对象.然后你可以得到你的最终数组Object.values:

let data = [{
    name: 'name1',
    values: {},
  },
  {
    name: 'name1',
    values: {},
  },
  {
    name: 'name2',
    values: {},
  },
  {
    name: 'name1',
    values: {},
  },
  {
    name: 'name3',
    values: {},
  }
];

var res = Object.values(data.reduce((a, {name}) => {
  a[name] = a[name] || {name, count: 0};
  a[name].count++;
  return a;
}, Object.create(null)));

console.log(res);
Run Code Online (Sandbox Code Playgroud)

请注意,我使用对象解构name从reduce回调中的每个"当前"对象获取值.并且该||模式是JS land中的标准实践,如果它不存在则分配默认值.

另请注意@ ibrahimmahrir关于使用Object.create(null)为累加器创建无原型对象的注释.