唯一对象键,但添加其他

时间:2015-11-08 01:49:12

标签: javascript

我有一个像这样的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 }]

我知道我可以循环并构建一个新数组,但有没有更清洁/更新的方法可以很好地为此工作?

2 个答案:

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

DEMO