пары значений ключа счетчика JavaScript - PullRequest
0 голосов
/ 27 июня 2018

Я хочу перебрать массив объектов и вернуть другой массив объектов с количеством записей на основе определенного значения свойства, такого как хеш-таблица.

Например:

Array1=[{"name":"Pam", "role":"ceo"}, {"name":"Joel", "role":"engineer"}, {"name":"Mary", "role":"ceo"}, {"name":"Alice", "role":"analyst"}, {"name":"John", "role":"analyst"}, {"name":"Nick", "role":"engineer"}, {"name":"Sam", "role":"analyst"}]

Array2 = [{key: "ceo", count: 2}, {key: "engineer", count: 2}, {key: "analyst", count:3}]

Мне нужен код, который генерирует Array2 из Array1. Очень ценю помощь:)

Решил мою проблему, спасибо

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Здесь у вас есть два варианта, как объект и как массив. (Требуется ES6)

let arr = [
  {"name":"Pam", "role":"ceo"},
  {"name":"Joel", "role":"engineer"},
  {"name":"Mary", "role":"ceo"},
  {"name":"Alice", "role":"analyst"}, 
  {"name":"John", "role":"analyst"}, 
  {"name":"Nick", "role":"engineer"},
  {"name":"Sam", "role":"analyst"}
]

let objResult = arr.reduce((acc, obj) => {
    acc[obj.role] = (acc[obj.role] || 0) + 1;
    return acc;
}, {});

console.log(objResult);

let arrResult = Object.keys(objResult).map(k => ({[k]: objResult[k]}));

console.log(arrResult)
0 голосов
/ 27 июня 2018

Вы можете использовать reduce, чтобы сгруппировать массив объектов в один объект. Используйте Object.values для преобразования объекта обратно в массив.

let Array1 = [{"name":"Pam", "role":"ceo"}, {"name":"Joel", "role":"engineer"}, {"name":"Mary", "role":"ceo"}, {"name":"Alice", "role":"analyst"}, {"name":"John", "role":"analyst"}, {"name":"Nick", "role":"engineer"}, {"name":"Sam", "role":"analyst"}]

let Array2 = Object.values(Array1.reduce((c, {role}) => {
  c[role] = c[role] || {key: role,count: 0};
  c[role].count++;
  return c;
}, {}));

console.log(Array2);
0 голосов
/ 27 июня 2018

Вы должны создать хеш-карту / объект, чтобы отслеживать уникальные значения.

Например:

let Array1=[{"name":"Pam", "role":"ceo"}, {"name":"Joel", "role":"engineer"}, {"name":"Mary", "role":"ceo"}, {"name":"Alice", "role":"analyst"}, {"name":"John", "role":"analyst"}, {"name":"Nick", "role":"engineer"}, {"name":"Sam", "role":"analyst"}]

let hashMap = {}

for(var employee of Array1){
  
  //if that role exists
  if(employee.role in hashMap ){
  
  //up the prev count
  hashMap[employee.role] = hashMap[employee.role] + 1; 
  
  }else{
   hashMap[employee.role] = 1;
  }
}

//now we will iterate through those keys of the Map and format it for Array 2

let outputArray = []
Object.keys(hashMap).forEach(key => {
  
  outputArray.push({
    key,
    count: hashMap[key]
  })
})

console.log(outputArray)
0 голосов
/ 27 июня 2018

Должно быть достаточно простым для понимания. Проверьте код.

let array1 = [
  { name: "Pam", role: "ceo" },
  { name: "Joel", role: "engineer" },
  { name: "Mary", role: "ceo" },
  { name: "Alice", role: "analyst" },
  { name: "John", role: "analyst" },
  { name: "Nick", role: "engineer" },
  { name: "Sam", role: "analyst" }
];

let obj = {};

array1.forEach(entry => (obj[entry.role] = (obj[entry.role] || 0) + 1));
let array2 = [];
for (role in obj) {
  array2.push({ key: role, count: obj[role] });
}

console.log(array2);
...