汇总 JSON 的数据
Summarizing data for JSON
{id:1, val:'author', hits:1},
{id:1, val:'author', hits:2},
{id:1, val:'reviewer', hits:1},
{id:2, val:'author', hits:100},
{id: 1, val:'author', hits:5}
等
我想要这样聚合这些数据的东西(可以是 Javascript、Jquery 或 Angular 具有单个循环的过滤器)
{id: 1, author:3, reviewer:1, hits:9 }
{id: 2, author:1, reviewer:0, hits:100}
现在让我有点头疼!!
一种可能的方法:
var source = [
{id:1, val:'author', hits:1},
{id:1, val:'author', hits:2},
{id:1, val:'reviewer', hits:1},
{id:2, val:'author', hits:100},
{id: 1, val:'author', hits:5}
];
var grouped = source.reduce(function(dict, el, i, arr) {
var obj = dict[el.id];
if (!obj) {
obj = {
id: el.id,
author: 0,
reviewer: 0,
hits: 0
};
dict.__arr.push(obj);
dict[el.id] = obj;
}
obj[el.val]++;
obj.hits += el.hits;
return i === arr.length - 1? dict.__arr : dict;
}, {__arr:[]});
Demo。通常,当您需要按某些条件对项目进行分组时,您可以使用 Array.reduce
和一些字典对象来组织分组过程。在这种情况下,它只是有点复杂,因为您需要从单个循环中获取结果数组;字典对象提供了一个特定的 属性 ('__arr'),它在构造字典时被填充。最后(用 i === arr.length - 1
检查)这个数组作为 .reduce.
的结果给出
{id:1, val:'author', hits:1},
{id:1, val:'author', hits:2},
{id:1, val:'reviewer', hits:1},
{id:2, val:'author', hits:100},
{id: 1, val:'author', hits:5}
等
我想要这样聚合这些数据的东西(可以是 Javascript、Jquery 或 Angular 具有单个循环的过滤器)
{id: 1, author:3, reviewer:1, hits:9 }
{id: 2, author:1, reviewer:0, hits:100}
现在让我有点头疼!!
一种可能的方法:
var source = [
{id:1, val:'author', hits:1},
{id:1, val:'author', hits:2},
{id:1, val:'reviewer', hits:1},
{id:2, val:'author', hits:100},
{id: 1, val:'author', hits:5}
];
var grouped = source.reduce(function(dict, el, i, arr) {
var obj = dict[el.id];
if (!obj) {
obj = {
id: el.id,
author: 0,
reviewer: 0,
hits: 0
};
dict.__arr.push(obj);
dict[el.id] = obj;
}
obj[el.val]++;
obj.hits += el.hits;
return i === arr.length - 1? dict.__arr : dict;
}, {__arr:[]});
Demo。通常,当您需要按某些条件对项目进行分组时,您可以使用 Array.reduce
和一些字典对象来组织分组过程。在这种情况下,它只是有点复杂,因为您需要从单个循环中获取结果数组;字典对象提供了一个特定的 属性 ('__arr'),它在构造字典时被填充。最后(用 i === arr.length - 1
检查)这个数组作为 .reduce.