[英]javascript count key value pairs
I want to iterate over an object array and return another object array with count of records based on a particular property value kind of like a hashtable. 我想遍历一个对象数组,并根据像哈希表这样的特定属性值类型返回另一个具有记录数的对象数组。
For example: 例如:
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" }
]
Expected output: 预期产量:
Array2 = [
{ key: "ceo", count: 2 },
{ key: "engineer", count: 2 },
{ key: "analyst", count: 3 }
]
I need a code that generates Array2 from Array1. 我需要一个从Array1生成Array2的代码。 Really appreciate the help :)
非常感谢您的帮助:)
Solved my problem, thanks 解决了我的问题,谢谢
Should be fairly straightforward to understand. 应该相当简单易懂。 Check the code.
检查代码。
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);
You can use reduce
to group the array of objects into a single object. 您可以使用
reduce
将对象数组分组为单个对象。 Use Object.values
to convert the object back into an array. 使用
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);
You have to create a hashmap/object to keep track of the unique counts. 您必须创建一个哈希图/对象来跟踪唯一计数。
For example: 例如:
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)
Here you have two variations, as object and as array. 在这里,您有两个变体,分别是对象和数组。 (ES6 required)
(需要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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.