Reputation: 109
I have an array of JSON
[
{
login: "LoginAAA",
url: "someurl-aaa",
number: 23
},
{
login: "LoginBBB",
url: "someurl-bbb",
number: 56
},
{
login: "LoginCCC",
url: "someurl-ccc",
number: 12
},
{
login: "LoginAAA",
url: "someurl-aaa",
number: 46
},
{
login: "LoginBBB",
url: "someurl-bbb"
number: 112
},
{
login: "LoginCCC",
url: "someurl-ccc",
number: 24
},
{
login: "LoginAAA",
url: "someurl-aaa",
number: 69
},
{
login: "LoginBBB",
url: "someurl-bbb",
number: 168
},
{
login: "LoginCCC",
url: "someurl-ccc",
number: 36
}
]
and I need to leave in array only objects with unique login but I have to sum the "number" of each "login" and assign total to unique "login". Additionaly: I need entire object (with url, etc...) with summed number.
I readed How to make a JSON array unique and Array unique values but not all is clear for me at this case.
Expectation/Result
[
{
login: "LoginAAA",
url: "someurl-aaa"
number: 138
},
{
login: "LoginBBB",
url: "someurl-bbb"
number: 336
},
{
login: "LoginCCC",
url: "someurl-ccc"
number: 72
}
]
Upvotes: 1
Views: 101
Reputation: 13966
Suppose var data
is where your array is defined. Using Array.reduce function you can do something like this.
data.reduce((acc, val) => {
if (acc[val.login] === undefined) {
acc[val.login] = val;
} else {
acc[val.login].number = acc[val.login].number + val.number
}
return acc;
}, {});
The result you will get from this is the following.
{
"LoginAAA": {
"login": "LoginAAA",
"url": "someurl-aaa",
"number": 253
},
"LoginBBB": {
"login": "LoginBBB",
"url": "someurl-bbb",
"number": 616
},
"LoginCCC": {
"login": "LoginCCC",
"url": "someurl-ccc",
"number": 132
}
}
For further understanding you can read the MDN documentation on Array.reduce method https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
Upvotes: 0
Reputation: 70
Just a simple and es6 based answer.
let result = [];
YOUR_JSON.forEach((item, index) => {
const temp = result.filter(e=>{return e.login === item.login});
if(temp.length > 0){
result[result.findIndex(e=>{return e.login ===item.login})].number += item.number;
}
else{
result.push(item);
}
});
You will get your result into result array.
[
{
login: "LoginAAA",
url: "someurl-aaa"
number: 138
},
{
login: "LoginBBB",
url: "someurl-bbb"
number: 336
},
{
login: "LoginCCC",
url: "someurl-ccc"
number: 72
}
]
Upvotes: 1
Reputation: 13146
Try like this;
var jsonObjectArray = JSON.parse(json);
var groupArray = [];
var totalNumber = 0;
jsonObjectArray.reduce(function (tmp, item) {
if (!tmp[item.login]) {
tmp[item.login] = {
number: 0,
login: item.login
};
groupArray.push(tmp[item.login])
}
totalNumber += item.number;
tmp[item.login].number += item.number;
return tmp;
}, {});
var result = { groupArray : groupArray, totalNumber : totalNumber }
Output:
{
"groupArray":[
{
"number":138,
"login":"LoginAAA"
},
{
"number":336,
"login":"LoginBBB"
},
{
"number":72,
"login":"LoginCCC"
}
],
"totalNumber":546
}
Also, the json which you shared in the question is invalid. The double quotes and comma for per field are required for json properties like;
{
"login": "LoginAAA",
"url": "someurl-aaa",
"number": 23
}
Upvotes: 0
Reputation: 484
You can make a new JSON object with the repeated keys. For example:
var newJSON = {};
Object.keys(oldJSON).forEach(function(k) {
newJSON[k] = newJSON[k] || {
url: oldJSON[k].url,
sum: 0
};
newJSON[k].sum += oldJSON[sum];
});
console.log(newJSON);
I hope this is what you were looking for.
Upvotes: 0