使用下划线.js计算对象属性

counting object properties with underscore.js

本文关键字:对象 属性 计算 js 下划线      更新时间:2023-09-26

所以我试图想出一种更好的方法来使用下划线来做到这一点:

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;
});

我想将列表中的各种名称组合成一个唯一名称列表,并计算每个唯一名称出现的次数。这似乎正是强调线旨在解决的问题,但我能想到的最佳解决方案似乎并不优雅。

我不是下划线.js用户,但我想_.groupBy()适合这种情况:

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

它不会以您想要的确切方式返回数组,但它包含您需要的所有信息。因此,您attributes["foo"]所有将"foo"作为值属性的项目neighborhood因此attributes["foo"].length它们的计数。

也许有更好的下划线.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