Задать вопрос
@vityuba

Как найти сумму элементов вложенных массивов?

Как найти сумму элементов массива? В массиве могут быть элементы любого типа и любая вложенность.

Например:

const array = [1, 2, 3, {}, NaN, [2, 4, 5, []]]
  • Вопрос задан
  • 632 просмотра
Подписаться 1 Средний 3 комментария
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
Рекурсия есть:

const sum = data =>
  Array.isArray(data)
    ? data.reduce((acc, n) => acc + sum(n), 0)
    : (+data || 0);

Рекурсии нет:

function sum(data) {
  const stack = [];
  let result = 0;

  for (let i = 0, arr = [ data ]; i < arr.length || stack.length; i++) {
    if (i === arr.length) {
      [ i, arr ] = stack.pop();
    } else if (arr[i] instanceof Array) {
      stack.push([ i, arr ]);
      [ i, arr ] = [ -1, arr[i] ];
    } else {
      result += +arr[i] || 0;
    }
  }

  return result;
}

Здесь, конечно, будет складываться всё, что можно сложить. Т.е., не только собственно числа, но и всё, что может быть сведено к числу, например true, '0xBB', { valueOf: () => 666 } и т.д.

Если нужно складывать только числа - предлагаю подумать самостоятельно, как изменить представленный код.
Ответ написан
otdameskapizm
@otdameskapizm
Помог ответ? Отметь решением...
Можете решить через агрегацию данных
const sum = (coll) => {
  const result = coll.reduce((acc, item) => {
    return acc += Array.isArray(item) ? sum(item) : (Number(item) || 0);
  }, 0);
  return result;
};
Ответ написан
@WAR_VIK
Если нужно сложить только числа, то можно вот так:
let print = s => console.log(s);
let arr = [1,'3', 2, 3, {}, NaN, [2, 4, 5, []]];
arr = arr.flat(Infinity);
let sum = 0;
for(let el of arr) {
  if(Number.isFinite(el)) sum += el;
}
print(sum);

Или так:
let print = s => console.log(s);
let arr = [1, '3', 2, 3, {}, NaN, [2, 4, 5, [] ]];
let sum = arr.flat(Infinity).filter(el => Number.isFinite(el)).reduce((acc,el) => acc + el, 0);
print(sum);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы