2015-11-08 87 views
1

我有一个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

我认为像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')}); 
+0

完美,谢谢! – dzm

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

相关问题