簡體   English   中英

用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM