总结JSON的数据

时间:2015-09-29 21:54:21

标签: javascript json aggregate-functions

{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} 

现在我突然想到这个!!

1 个答案:

答案 0 :(得分:1)

一种可能的方法:

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的结果给出的。