如何遍历对象数组并计算存在多少个重复值?

时间:2019-04-01 15:18:47

标签: javascript arrays object for-loop counter

让我们说我有一个带有不同键的对象列表,其中之一是名称

var resulttemp = [{name: "HYD. CYLINDER"}, {name: "pelle"}, {name: "HYD. CYLINDER"}, {name: "1212"}, {name: "pelle"}]

最终结果应该是:

var uniquePartNamesWithCount = [{name: "HYD. CYLINDER", count: 2}, {name: "pelle", count: 2}, {name: "1212", count: 1}]

我知道如何将唯一名称推入数组,但是如何设法添加计数器

2 个答案:

答案 0 :(得分:4)

一种解决方案是使用Array.reduce()生成一个对象,该对象将保存每个名称以及与之相关的计数器。最后,您可以使用Object.values()来获取所需的数组。

var input = [
  {name: "HYD. CYLINDER"},
  {name: "pelle"},
  {name: "HYD. CYLINDER"},
  {name: "1212"},
  {name: "pelle"}
];

let res = input.reduce((acc, {name}) =>
{
    acc[name] = acc[name] || ({name, count: 0});
    acc[name].count++;
    return acc;    
}, {});

console.log(Object.values(res));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

如果您需要按计数器排序的最终数组,则可以执行以下操作:

console.log( Object.values(res).sort((a, b) => b.count - a.count) );

答案 1 :(得分:2)

这就是您想要的:

// Declarations
var resulttemp = [
  {name: "HYD. CYLINDER"},
  {name: "pelle"},
  {name: "HYD. CYLINDER"},
  {name: "1212"},
  {name: "pelle"}
];
const counts = {}
const uniquePartNamesWithCount = []

// Get sums
for (let obj of resulttemp){
  if(counts[obj.name]){ counts[obj.name]++;} 
  else{counts[obj.name] = 1 }
}

// Add objects to final array
const keys = Object.keys(counts);
for(let key of keys){
  let obj = {};
  obj[key] = counts[key];
  uniquePartNamesWithCount.push(obj);
}

// Print results
console.log(uniquePartNamesWithCount);