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.