如何从JSON中总结数字?

时间:2015-04-08 02:56:34

标签: javascript jquery

我有以下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解决方案很好。

4 个答案:

答案 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);
});