Reputation: 21766
I want to filter down my array of object based upon the one key. If that key is same in other object then second value of object will be added. I have an array of object like below:
Input:
var myArray = [
{
_name : "Mike",
_amount : "7"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "2"
},
{
_name : "Mike",
_amount : "10"
},
{
_name : "Kate",
_amount : "0"
},{
_name : "Edison",
_amount : "10"
}
]
Output:
var myNewArray = [
{
_name : "Mike",
_amount : "17"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "12"
},
{
_name : "Kate",
_amount : "0"
},
]
Mike and Edison is repeated twice so _amount key's value added for those objects. Its little confusing for me. Please help me out. Thank you!
Upvotes: 4
Views: 1227
Reputation: 26161
In terms of ES6 this is how it is done.
var myArray = [
{
_name : "Mike",
_amount : "7"
},
{
_name : "Julius",
_amount : "10"
},
{
_name : "Edison",
_amount : "2"
},
{
_name : "Mike",
_amount : "10"
},
{
_name : "Kate",
_amount : "0"
},{
_name : "Edison",
_amount : "10"
}
],
result = myArray.reduce((p,c) => {var o = p.find(e => e._name == c._name);
!!o ? o._amount = (o._amount*1+c._amount*1)+"" : p.push(c);
return p;},[]).sort((a,b) => b._amount-a._amount);
console.log(result);
Upvotes: 2
Reputation: 386600
You could use Array#forEach
and an object as reference for the inserted objects.
var myArray = [{ _name: "Mike", _amount: "7" }, { _name: "Julius", _amount: "10" }, { _name: "Edison", _amount: "2" }, { _name: "Mike", _amount: "10" }, { _name: "Kate", _amount: "0" }, { _name: "Edison", _amount: "10" }],
newArray = [];
myArray.forEach(function (a) {
if (!this[a._name]) {
this[a._name] = { _name: a._name, _amount: 0 };
newArray.push(this[a._name]);
}
this[a._name]._amount = (+this[a._name]._amount + +a._amount).toString(); // if you really
}, Object.create(null)); // need strings
console.log(newArray);
As requested sorted by _amount
descending
var myArray = [{ _name: "Mike", _amount: "7" }, { _name: "Julius", _amount: "10" }, { _name: "Edison", _amount: "2" }, { _name: "Mike", _amount: "10" }, { _name: "Kate", _amount: "0" }, { _name: "Edison", _amount: "10" }],
newArray = [];
myArray.forEach(function (a) {
if (!this[a._name]) {
this[a._name] = { _name: a._name, _amount: 0 };
newArray.push(this[a._name]);
}
this[a._name]._amount += +a._amount
}, Object.create(null));
newArray.sort(function (a, b) {
return b._amount - a._amount;
});
console.log(newArray);
Upvotes: 3
Reputation: 196
What you are looking to use is a map where you store the keys (names) and their corresponding amounts. You add to the corresponding amount for a key if you encounter it once again. You can then go through the map and add objects to an array.
var myArray = [
{
_name:"Mike",
_amount: 7
},
{
_name:"Julius",
_amount: 10
},
{
_name:"Edison",
_amount: 2
},
{
_name:"Mike",
_amount: 10
},
{
_name:"Kate",
_amount: 0
},{
_name:"Edison",
_amount: 10
}
];
var map = {};
for (var i = 0 ; i < myArray.length ; i++) {
var key = myArray[i]['_name'];
var amount = myArray[i]['_amount'];
if (!map[key]) {
map[key] = amount;
} else {
map[key] += amount;
}
}
var outputArray = [];
for (var key in map) {
if (map.hasOwnProperty(key)) {
outputArray.push({_name: key, _amount: map[key]});
}
}
Upvotes: 0