我有一个对象数组,我想找到某个属性(键)的数组长度的总和。 我有像这样的对象数组
var myArray =
[{
"a" : 1,
"b" : another Array
},
{
"c" : 2,
"b" : another Array
}
.....
]
有什么方法可以简化以下过程吗?
var lengthOfEachObject = myArray.map(function(Obj){
if(Obj.b){
return Obj.b.length;
}
else{
return 0;
}
});
lengthofEachObject.reduce(function(x,y){
return x+y;
})
答案还可以包括使用外部库。
答案 0 :(得分:1)
您可以在不使用.map
的情况下使用.reduce
,这样一来,您只需对数组进行一次迭代即可获得总和。此外,您可以使用destructing assignment代替if
语句为b.length
设置默认值(如果不存在)。
请参见下面的工作示例:
const arr = [{a: 1, b: [1, 2, 3, 4, 5] }, {c: 2, b: [1, 2, 3]}, {e: 3}],
total = arr.reduce((acc, {b={length:0}}) => acc + b.length, 0);
console.log(total);
答案 1 :(得分:1)
您可以使用lodash的_.sumBy()
:
var myArray = [{"a":1,"b":[1,2,3]},{"c":2,"b":[4,5,6,7,8]},{"c":2}]
var result = _.sumBy(myArray, 'b.length')
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
答案 2 :(得分:0)
您可以在所需键上加上闭合符来拉出长度,并映射该值。
const
length = k => ({ [k]: { length = 0 } = {} }) => length,
add = (a, b) => a + b,
array = [{ a: 1, b: [1, 2, 3, 4] }, { c: 2, b: [1, 2, 3] }];
console.log(array.map(length('b')).reduce(add));
console.log(array.map(length('a')).reduce(add));