Есть ли прямой метод, который возвращает сумму длин массивов в массиве объектов? - PullRequest
0 голосов
/ 24 января 2019

У меня есть массив объектов, и я хочу найти сумму длин массивов определенного свойства (ключа).У меня есть этот массив объектов, таких как

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 голосов
/ 24 января 2019

Вы можете вытянуть длину с замыканием на нужный ключ и отобразить это значение.

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));
0 голосов
/ 24 января 2019

Вы можете использовать lodash's _.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>
0 голосов
/ 24 января 2019

Вы можете использовать .reduce без .map, таким образом, вы можете получить общую сумму, выполнив итерацию только один раз по вашему массиву.Кроме того, вы можете использовать разрушающее присваивание вместо ваших 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);
...