0

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??

1
  • 5
    what goes wrong? please add your try. Commented Jul 18, 2020 at 16:21

6 Answers 6

3

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)

Sign up to request clarification or add additional context in comments.

1 Comment

how to add one more field like itemId??
2

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

Comments

1

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

Comments

0

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))

Comments

0

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)



Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.