我有一个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
}
]

我需要在数组中只保留具有唯一登录名的对象,但我必须总结"数字"每个"登录"并将总数分配给唯一的"登录"。 另外:我需要整个对象(带网址等)和总数。
我引用了How to make a JSON array unique和Array unique values,但在这种情况下并非一切都清楚。
期望/结果
[
{
login: "LoginAAA",
url: "someurl-aaa"
number: 138
},
{
login: "LoginBBB",
url: "someurl-bbb"
number: 336
},
{
login: "LoginCCC",
url: "someurl-ccc"
number: 72
}
]

答案 0 :(得分:1)
只是一个基于es6的简单答案。
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);
}
});
您将把结果输入结果数组。
[
{
login: "LoginAAA",
url: "someurl-aaa"
number: 138
},
{
login: "LoginBBB",
url: "someurl-bbb"
number: 336
},
{
login: "LoginCCC",
url: "someurl-ccc"
number: 72
}
]
答案 1 :(得分:0)
您可以使用重复的键创建一个新的JSON对象。 例如:
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);
我希望这就是你要找的东西。
答案 2 :(得分:0)
试试这个;
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 }
<强>输出:强>
{
"groupArray":[
{
"number":138,
"login":"LoginAAA"
},
{
"number":336,
"login":"LoginBBB"
},
{
"number":72,
"login":"LoginCCC"
}
],
"totalNumber":546
}
此外,您在问题中分享的json无效。对于json属性,
需要每个字段的双引号和逗号 {
"login": "LoginAAA",
"url": "someurl-aaa",
"number": 23
}
答案 3 :(得分:0)
假设var data
是您定义数组的位置。使用Array.reduce函数你可以做这样的事情。
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;
}, {});
您将从中得到以下结果。
{
"LoginAAA": {
"login": "LoginAAA",
"url": "someurl-aaa",
"number": 253
},
"LoginBBB": {
"login": "LoginBBB",
"url": "someurl-bbb",
"number": 616
},
"LoginCCC": {
"login": "LoginCCC",
"url": "someurl-ccc",
"number": 132
}
}
为了进一步理解,您可以阅读有关Array.reduce方法https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
的MDN文档