Я читаю книгу под названием Eloquent JavaScript . В нем есть упражнение, требующее выравнивания неоднородного массива, и после долгих попыток получить ответ я не смог найти решение в сети и не смог понять код. Я надеюсь, что кто-то будет достаточно любезен, чтобы объяснить, особенно для аргумента «плоский» и как это должно работать. Код ниже

var arrays = [[1, 2, 3], [4, 5], [6]]; console.log(arrays.reduce(function(flat, current) { return flat.concat(current); }, [])); 

Функция приведения, определенная в книге:

 function reduce(array, combine, start) { var current = start; for (var i = 0; i {amp}lt; array.length; i  ) current = combine(current, array[i]); return current; } 

и как метод массива,

 arr.reduce(combine, start); 

Давайте посмотрим на каждую часть метода Reduce. Книга описывает это как «складывание массива, по одному элементу за раз». Первым аргументом для reduce является «функция объединения», которая принимает два аргумента: «текущее» значение и «следующий» элемент в массиве.

Теперь начальное «текущее» значение задается в качестве второго аргумента функции Reduce, а в решении сглаживающих arrays, это пустой массив, [] . Обратите внимание, что в начале «следующим» элементом в массиве является 0-й элемент.

Цитирую книгу, чтобы заметить: «Если ваш массив содержит хотя бы один элемент, вам разрешено не указывать аргумент start».

Также может сбивать с толку тот факт, что в решении сплющивания current помещается в качестве второго аргумента для уменьшения, тогда как в приведенном выше определении reduce current используется для назначения кумулятивного сложенного значения. В решении сглаживания current относится к «следующему» элементу arrays (отдельному массиву целых чисел)

Теперь на каждом шаге сокращения «текущее» значение плюс следующий элемент массива подается в (анонимный) объединитель, а возвращаемое значение становится обновленным «текущим» значением. То есть мы использовали элемент массива и переходим к следующему элементу.

flat — просто имя, данное накопленному результату. Поскольку мы хотим вернуть плоский массив, это подходящее имя. Поскольку у массива есть функция concat , первый шаг функции concat (притворяется, что я могу назначить внутренние переменные)

 flat = []; // (assignment by being the second argument to reduce) 

Теперь пройдемся по редукции как итерации по arrays , выполнив шаги, показанные выше в определении less.

  for (var i = 0; i {amp}lt; arrays.length; i  ) flat = combine(flat, arrays[i]); 

Вызывающий combine дает [].concat([1, 2, 3]) // ={amp}gt; [1, 2, 3]

Потом,

 flat = [1, 2, 3].concat([4, 5]) // ={amp}gt; [1, 2, 3, 4, 5] 

и снова для следующей итерации сокращения. Окончательное возвращаемое значение функции Reduce является окончательным значением flat .

Я реализовал это решение, и это, похоже, работает и для вложенных массивов.

 function flattenArray(arr){ for(var i=0;i{amp}lt;arr.length;i  ){ if(arr[i] instanceof Array){ Array.prototype.splice.apply(arr,[i,1].concat(arr[i])) } } return arr; } 

Это было бы решением, которое я пришел с форматом ES6:

 const reduced = arrays.reduce((result,array) ={amp}gt; result.concat(array),[]); console.log(reduced); 
 function reduce(array, combine, start) { let current = start; for (let element of array) { current = combine(current, element); } return current; } let arrays = [[1, 2, 3], [4, 5], [6]]; console.log(reduce(arrays, (a, b) ={amp}gt; a.concat(b), []));