我有一个像这样的JSON对象:
[ { browser: 'IE', count: 5 },
{ browser: 'Safari', count: 4 },
{ browser: 'Mobile Safari', count: 4 },
{ browser: 'IE', count: 9 } ]
我想做的事情基本上是浏览器的唯一价值。所以在这种情况下,它会被转换为(计数值加在一起):
[ { browser: 'IE', count: 14 },
{ browser: 'Safari', count: 4 },
{ browser: 'Mobile Safari', count: 4 }]
我知道我可以循环并构建一个新数组,但有没有更清洁/更新的方法可以很好地为此工作?
答案 0 :(得分:2)
我认为像LoDash这样的库是较新方法的一部分。否则你只需要在javascript中蛮力解决这个问题。
var arr = [ { browser: 'IE', count: 5 },
{ browser: 'Safari', count: 4 },
{ browser: 'Mobile Safari', count: 4 },
{ browser: 'IE', count: 9 } ]
arr = _.map(_.groupBy(arr,'browser'), function(value, key) {
return { browser: key, count: _.sum(value,'count') };
});
alert(JSON.stringify(arr));
http://jsfiddle.net/thinkingmedia/d40Ljjk5/
首先按browser
分组,然后你可以求和计数值。缺点是你必须重建对象。如果您知道格式是什么,那很好。
另一种方法是假设第一个对象是正确的模式,并更新计数值。
像这样的东西
arr = _.map(_.groupBy(arr,'browser'), function(value, key) {
var x = _.first(value);
x.count = _.sum(value,'count');
return x;
});
http://jsfiddle.net/thinkingmedia/nj0h0bpg/1/
编辑:以上是一条单行方式。
return _.merge(_.first(value), {count: _.sum(value,'count')});
答案 1 :(得分:0)
带缓存的纯JS解决方案怎么样?
var seen = {};
var reduced = data.reduce(function(pre, next) {
if(typeof seen[next.browser] !== 'undefined') {
pre[seen[next.browser]].count += next.count;
return pre;
}
var temp = {
browser: next.browser,
count: next.count
}
var index = pre.push(temp) - 1;
seen[temp.browser] = index;
return pre;
}, []);