是否有任何直接方法返回对象数组中数组长度的总和?

时间:2019-01-24 11:58:11

标签: javascript lodash

我有一个对象数组,我想找到某个属性(键)的数组长度的总和。 我有像这样的对象数组

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

答案还可以包括使用外部库。

3 个答案:

答案 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));