как зациклить массив объектов и посчитать, сколько существует повторяющихся значений? - PullRequest
0 голосов
/ 01 апреля 2019

Допустим, у меня есть список объектов с разными ключами, один из которых name .

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}]

Я знаю, как просто отправить уникальные имена в массив, но как мне удается добавить counter ?

Ответы [ 2 ]

5 голосов
/ 01 апреля 2019

Одним из решений является использование 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) );
2 голосов
/ 01 апреля 2019

Это делает то, что вы ищете:

// 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);
...