2012-05-06 44 views
0

所以我試圖想一個更好的方式與下劃線做到這一點計數對象屬性名稱以及每個唯一名稱出現次數。這似乎正好是這種問題的下劃線旨在解決,但我能想到的最佳解決方案似乎不夠優雅。與underscore.js

回答

4

我不是underscore.js用戶,但我想_.groupBy()適合這樣的場景:

var attributes = _.groupBy(list, function (item) { 
    return item.data.neighborhood 
}) 

它不返回你想要的確切方式數組,但它包含了所有的信息你需要。所以你已經在attributes["foo"]所有具有「foo」值的物品作爲neighborhood值屬性,因此在attributes["foo"].length中它們的數量。

+0

感謝您的回答;我應該再次嘗試groupBy,但我認爲上面的提供了有多少個街區的計數。我正在尋找有關每個社區有多少價值的計數。例如北:2,西:5,而不是社區:2. – BishopZ

+0

'groupBy'完全符合你的要求。你將得到:'attributes [「north」]'包含一個數組,其中所有項的鄰域等於「北」,所以使用:attributes [「north」] .length和attributes [「west」] .length'你會有'2'和'5'。 – ZER0

1

也許有更好的方式underscore.js,但你已經可以應用其他優化:

而不是使用一個數組來跟蹤的名稱和數量的,使用name: count地圖。這可以用一個對象來輕鬆完成:

state.attributes = _.reduce(list, function(memo, item){ 
    var n = item.data.neighborhood; 
    memo['neighborhood'] = (memo['neighborhood'] || {}); 
    memo['neighborhood'][n] = memo['neighborhood'][n] + 1 || 1; 
    return memo; 
}); 

這工作,因爲如果item.data.neighborhood是不在列表中呢,memo['neighborhood'][item.data.neighborhood]將返回undefinedundefined + 1回報NaN
由於NaN的計算結果爲false,因此表達式NaN || 1將導致1

+0

不錯。好多了。謝謝! – BishopZ