Как сгладить массив с помощью reduce?

183
06 августа 2021, 17:30
let arr1 = [1, [2,[3,[4]]]];
let array = arr1.reduce( function (sum, elem) {
  return sum.concat(elem);
  }
);
console.log(array ); 

Ошибка:

Uncaught TypeError: sum.concat is not a function
    at index.html:635
    at Array.reduce (<anonymous>)
    at index.html:634
    (anonymous) @ index.html:635
    (anonymous) @ index.html:634

В чем проблема?

Answer 1

В общем, если я правильно понял вопрос, нужно посчитать сумму чисел во вложенных списках списка arr1, для начала мы преобразуем список списков в один список, в котором будут все данные и потом их сложим.

let arr1 = [1, [2,[3,[4]]]]; 
 
//для глубокого упрощения используем рекурсивно reduce и concat 
function flattenDeep(arr1) { 
   return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []); 
} 
const array1 = flattenDeep(arr1); 
console.log(array1); // => [ 1, 2, 3, 4 ] 
 
const reducer = (accumulator, currentValue) => accumulator + currentValue; 
result = array1.reduce(reducer); 
 
console.log(result); // => 10

Источник:
1. https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
2. https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce

READ ALSO
Преобразование строки в JSON через JSON.parse

Преобразование строки в JSON через JSON.parse

Я получаю с сервера экранированную строку в виде:

222
Как сделать блок некликабельным

Как сделать блок некликабельным

Есть скрипт выпадающего блока, проблема в том, если его открыть, то он закрывается по любому клику (не важно кликните вы по открывшимся блоке...

377
Передача данных между элементами React

Передача данных между элементами React

Пытаюсь разобраться, как передавать данные между siblings-компонентамиИдея такая: нужно сделать так, чтоб класс active был только у одного child-компонента...

176