![](/img/trans.png)
[英]Remove empty properties / falsy values from Object with Underscore.js
[英]counting object properties with underscore.js
因此,我試圖通過下划線考慮一種更好的方法:
state.attributes = _.reduce(list, function(memo, item){
memo['neighborhood'] = (memo['neighborhood'] || []);
var isNew = true;
_.each(memo['neighborhood'], function(hood){
if (hood.name === item.data.neighborhood) {
hood.count++; isNew=false;
}
});
if(isNew){
memo['neighborhood'].push({name:item.data.neighborhood, count:1});
}
return memo;
});
我想將列表的各種名稱組合成唯一名稱列表,並計算每個唯一名稱出現多少次。 下划線似乎正是要解決的問題,但我能想到的最佳解決方案似乎不夠優雅。
我不是underscore.js用戶,但我猜_.groupBy()
適合這種情況:
var attributes = _.groupBy(list, function (item) {
return item.data.neighborhood
})
它不會以您想要的確切方式返回數組,但是包含您需要的所有信息。 因此,您將attributes["foo"]
所有具有“ foo”作為neighborhood
值屬性的項目,因此,在attributes["foo"].length
中將其計數。
也許有更好的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]
將返回undefined
並且undefined + 1
返回NaN
。
由於NaN
計算結果為false
,因此表達式NaN || 1
NaN || 1
將導致1
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.