使用下划线.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;
});
我想将列表中的各种名称组合成一个唯一名称列表,并计算每个唯一名称出现的次数。这似乎正是强调线旨在解决的问题,但我能想到的最佳解决方案似乎并不优雅。
我不是下划线.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]
将返回undefined
,undefined + 1
返回NaN
。
由于NaN
的计算结果为 false
,表达式NaN || 1
将导致1
。
相关文章:
- 如何从对象的原型方法访问JavaScript对象属性
- 如何将数组项添加到对象属性中
- 设置嵌套对象属性的更好方法
- JavaScript管理具有重复属性名称的对象属性
- 如何使用element.myobj.prop等具有对象属性的元素
- 如何使用(this)访问Angular 2 http rxjs catch函数中的对象属性
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 如何在AngularJS工厂中正确声明对象属性
- 如何使用object.assign()从其他对象引用基本对象属性
- 使用XPath样式访问Javascript JSON对象属性
- 将javascript对象(属性+值)合并到一个对象中
- 数组:使对象属性成为数组键
- 无法从JavaScript中的函数调用对象属性
- Google Closure Advanced |无法识别对象属性|动态属性
- Javascript从匿名函数访问外部对象属性
- 从函数更改对象属性
- 如何从字符串变量访问对象属性
- 从嵌套对象属性中获取排除某个值的最高值
- 在Aurelia computeds中,当设置依赖关系时,如何声明对对象属性的依赖关系
- 传递数量不确定的可能嵌套的对象属性