我有以下JSON示例。我想总结与'numberOfPoint'
对应的'Name'
来获得积分总数。在这种情况下,名称A的总数为6,名称B的总数为2,名称C的总数为2。
{ "data": [
{
"id": {
"year": 2015,
"Name": "A"
},
"numberOfPoint": 2
},
{
"id": {
"year": 2014,
"Name": "A"
},
"numberOfPoint": 2
},
{
"id": {
"year": 2014,
"Name": "B"
},
"numberOfPoint": 2
},
{
"id": {
"year": 2014,
"Name": "C"
},
"numberOfPoint": 2
},
{
"id": {
"year": 2013,
"Name": "A"
},
"numberOfPoint": 2
}]
}
如何为每个名字总结numberOfPoint
?纯JavaScript或jQuery解决方案很好。
答案 0 :(得分:5)
假设 obj
是您的JSON ,以下解决方案应该可以正常工作。
var result = {};
obj.data.forEach(function (a) { result[a["id"]["Name"]] = (result[a["id"]["Name"]] || 0) + a["numberOfPoint"]; });
result
是值存储的位置。 result
看起来像:
{
"A": 6,
"B": 2,
"C": 2
}
一旦您能够对其进行反混淆,这很简单。首先定义对象(result
)。然后我们遍历obj.data
中的所有项目。接下来,我们找到与该项目相关联的name
,我们将其作为关键字。然后我们使用 OR 速记来查看是否定义了它,如果没有,则将其设置为零。最后,添加值。这是重复的。
使用.reduce
看起来更适合这种事情:
obj.data.reduce(function (b,a) { return (b["id"]["Name"]] = (b[a["id"]["Name"]] || 0) + a["numberOfPoint"]) },{});
答案 1 :(得分:3)
我喜欢使用reduce
来做这类事情
yourObj.data.reduce(function(sums, elem) {
var name = elem.id.Name;
if (!sums[name]) sums[name] = 0;
sums[name] += elem.numberOfPoint;
return sums;
}, {});
输出
{A: 6, B: 2, C: 2}
更实用的方法可能看起来像这样
yourObj.data.map(function(elem) {
return {key: elem.id.Name, value: elem.numberOfPoint};
}).reduce(function(sum, elem) {
sum[elem.key] = (sum[elem.key] || 0) + elem.value;
return sum;
}, {});
输出
{A: 6, B: 2, C: 2}
这种更加分解的方法的优点是你的功能体明显不那么复杂,只需快速浏览就可以轻松理解,并且可以重复使用
在我们分离出可重复使用的位后,这可能是什么样子
// create some reusable functions
function mapToKeyValue(obj) {
return {key: obj.id.Name, value: obj.numberOfPoint};
}
function sumKeyValues(sum, obj) {
sum[obj.key] = (sum[obj.key] || 0) + obj.value;
return sum;
}
// now manipulate your data with ease
var result = yourObj.items.map(mapToKeyValue).reduce(sumKeyValues, {});
输出
{A: 6, B: 2, C: 2}
答案 2 :(得分:2)
您可以编写像bellow
这样的函数var sum = function(obj) {
var result = {};
for (var i = 0; i < obj.data.length; i++) {
var element = obj.data[i];
if (result[element.id.Name])
result[element.id.Name] += element.numberOfPoint;
else
result[element.id.Name] = element.numberOfPoint;
};
return result;
};
并将此功能称为bellow
console.log(sum(givenData));
其中givenData
是您提供的数据。
输出应该像下面那样
{ A: 6, B: 2, C: 2 }
答案 3 :(得分:1)
带上一粒盐......我很懒。
var x = {...},
sum = {};
x.data.forEach(function (elem) {
var _sum = sum[elem.id.Name];
if (!_sum) {
_sum = 0;
}
_sum += parseInt(elem.numberOfPoint, 10);
});