2015-11-08 89 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

相關問題