2015-06-19 44 views
0

我有一個要求來查找每個「類型」的「count」字段的總和。 有沒有辦法使用lodash或下劃線js來做同樣的事情。 非常感謝您的幫助。謝謝。使用lodash或underscorejs查找數組字段總和

輸入數組

array = [ 
    { 
     type: 'weibo', 
     count: 1 
    }, 
    { 
     type: 'xing', 
     count: 1 
    }, 
    { 
     type: 'twitter', 
     count: 1 
    }, 
    { 
     type: 'twitter', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    }, 
    { 
     type: 'facebook', 
     count: 1 
    } 
] 

預計輸出

output = [ 
     { 
      type: 'weibo', 
      count: 1 
     }, 
     { 
      type: 'xing', 
      count: 1 
     }, 
     { 
      type: 'twitter', 
      count: 2 
     }, 
     { 
      type: 'facebook', 
      count: 3 
     } 
    ] 
+0

@RuneFS我看到你再次;-) –

+0

行走你的商品:)以及它是像這樣的東西做。雖然評論是不正確的,因爲我估計今天不能閱讀和理解... 並尋求使用和反饋是改善我知道的最好的方法:) –

回答

2

您可以用_.countBy()_.map()做到這一點;請注意,由於中間轉換爲對象,輸出數組的順序可能不同。

var array = [ 
 
    { 
 
     type: 'weibo', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'xing', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'twitter', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'twitter', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    }, 
 
    { 
 
     type: 'facebook', 
 
     count: 1 
 
    } 
 
    ]; 
 

 
console.log(_.map(_.countBy(array, 'type'), function(value, key) { 
 
    return { 
 
    type: key, 
 
    count: value 
 
    }; 
 
}));
<script src="http://underscorejs.org/underscore.js"></script>

+0

謝謝。它真的幫助了我..非常感謝你.. – Dibish

0

您可以_.reduce_.values做一個合格(像往常一樣):

var sums = _(array).reduce(function(memo, e) { 
    if(!memo[e.type]) 
     memo[e.type] = { type: e.type, count: 0 }; 
    memo[e.type].count += 1; 
    return memo; 
}, { }); 
var what_you_want = _(sums).values(); 

或者,如果你想跳過_.values電話,你可以跟蹤的一個對象(按類型索引)和一個數組(實際上是你之後的數據),並共享它們之間的引用:

var sums = _(array).reduce(function(memo, e) { 
    if(!memo.by_type[e.type]) { 
     memo.by_type[e.type] = { type: e.type, count: 0 }; 
     memo.values.push(memo.by_type[e.type]); 
    } 
    memo.by_type[e.type].count += 1; 
    return memo; 
}, { by_type: { }, values: [ ] }); 
var what_you_want = sums.values; 

後一種方法保證輸出順序與輸入順序匹配。

演示:https://jsfiddle.net/ambiguous/hgnz04bd/