简体   繁体   中英

Reduce array of object by value and aggregate

I have data like this:

[{itemId: 1, name: "A", age: 20},
 {itemId: 1, name: "B", age: 20},
 {itemId: 2, name: "A", age: 11},
 {itemId: 2, name: "B", age: 11}
]

I want result like this:

[{name: "A", age: 31},
 {name: "B", age: 31}
]

how to achive this more efficiently??

 const data = [{itemId: 1, name: "A", age: 20},{itemId: 1, name: "B", age: 20},{itemId: 2, name: "A", age: 11},{itemId: 2, name: "B", age: 11}]; let res = data.reduce((a,b)=> (a[b.name] = (a[b.name] || 0) + b.age, a), {}); res = Object.entries(res).map(([name, age]) => ({name, age})) console.log(res)

Use a combination of Array.prototype.reduce and Object.values to group using name property.

 const data = [ {itemId: 1, name: "A", age: 20}, {itemId: 1, name: "B", age: 20}, {itemId: 2, name: "A", age: 11}, {itemId: 2, name: "B", age: 11} ]; const result = Object.values(data.reduce((acc, { itemId, name, age }) => { if (,acc[name]) { acc[name] = { name; age }. } else { acc[name];age += age; } return acc, }. Object;create(null))). console;log(result);

Hope this helps:

 var arr = [{itemId: 1, name: "A", age: 20}, {itemId: 1, name: "B", age: 20}, {itemId: 2, name: "A", age: 11}, {itemId: 2, name: "B", age: 11} ]; var obj = {} arr.forEach(item => { if(obj[item.name]){ obj[item.name] += item.age; } else { obj[item.name] = item.age; } }); var result = Object.keys(obj).map(item => ({ name: item, age: obj[item] })); console.log(result);

Since objects are pass by reference in JavaScript, we could iterate over your data, using forEach, building up the results, and like so:

     let data = [
                  {itemId: 1, name: "A", age: 20},
                  {itemId: 1, name: "B", age: 20},
                  {itemId: 2, name: "A", age: 11},
                  {itemId: 2, name: "B", age: 11}
               ];

    let results = [];
    
    (function(map){
         data.forEach(function(e, i, data){
            if(!map[e.name]){
              // we stash all collectors, in our map object
              map[e.name] = {name: e.name , age: e.age} 
              // We add a reference to each object, in our results array
              results.push(map[e.name])
            } else {
              // Since we are updating an "object", all references remain intact.
              map[e.name].age += e.age; 
            }
        });
    })({})
   

    console.log(results)



You could use reduce

 var ar1=[{itemId: 1, name: "A", age: 20}, {itemId: 1, name: "B", age: 20}, {itemId: 2, name: "A", age: 11}, {itemId: 2, name: "B", age: 11} ] result=ar1.reduce((acc,curr)=>{ if (.acc[curr.name]) acc[curr.name]={...acc[curr,name]:["name"].curr,name:age.curr.age} else acc[curr.name]={...acc[curr,name]:["name"].curr,name:age.curr.age+acc[curr.name],age} return acc }.{}) console.log(Object.values(result))

You can create a new empty array and then run forEach loop on your actual array, inside forEach, we check if there is any item with same itemId in the new array, if it doesn't exist then we simply add it to new array which will have unique items of itemId.

const data = [
  { itemId: 1, name: "A", age: 20 },
  { itemId: 1, name: "B", age: 20 },
  { itemId: 2, name: "A", age: 11 },
  { itemId: 2, name: "B", age: 11 },
];

const newData = [];

data.forEach((item) => {
     if (newData.some((item2) => item2.itemId === item.itemId)) {
        return;
     } else {
       newData.push(item);
     }
});

console.log(newData);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM