Ниже приведена функция reduce()
function reduce(array, combine, start) {
let current = start;
for (let element of array) {
current = combine(current, element);
}
return current;
}
Теперь это вопрос, который я решаю
Используйте метод уменьшения в сочетании с методом concat для "сглаживания" массива массивов в один массив, который имеет все элементы исходных массивов.
Вот решение
let arrays = [[1, 2, 3], [4,5], [6]];
console.log(arrays.reduce((flat,current)=> flat.concat(current), []));
// → [1, 2, 3, 4, 5, 6]
Теперь, если я попробую это
let arrays = [[1, 2, 3], [4, [79],5], [6]];
console.log(arrays.reduce((flat, current) => flat.concat(current), []));
Я получаю это
[1, 2, 3, 4, [79], 5, 6]
Это означает, что это решение может получить массив flatten только до двух вложенных массивов. Но как это работает для этих массивов = [[1, 2, 3], [4,5], [6]];
Потому что в функции reduce() я использую для (пусть элементы массива), кстати, если я использую
Он работает так
array = [1,4,6,[6,7],7,6,8,6];
for(element of array)
console.log(element);
// 146[6,7]7686
Он не получает значение из вложенного массива. Тогда как это делается для первого решения. Как написать решение, которое работает для любого количества вложенных массивов, я знаю, что он будет использовать рекурсию, но как?
почему эта функция может только сгладить массив до одного уровня глубиной?
let arrays = [[1, 2, 3], [4, [79],5], [6]];console.log(arrays.reduce((flat, current) => flat.concat(current), []))
Поскольку функция уменьшения не знает, пытаетесь ли вы объединить примитив (число) или массив. Когда функции сокращения пытаются объединить два массива, он создает один массив, но не знает, является ли каждый элемент массива числом или массивом.
Затем, как вы сказали, вы можете использовать рекурсию:
function flatten(arrayToFlatten){
return arrayToFlatten.reduce((prev, next)=>{
if(!Array.isArray(next)){ // Base case, when you have a number
return prev.concat(next);
} else { // Recursive case, when you have an array
return prev.concat(flatten(next));
}
}, []);
}
Ты можешь сделать:
const arrays = [[1, 2, 3],[4, [79], 5],[6]];
const getFlatten = array => array.reduce((a, c) => a.concat(Array.isArray(c) ? getFlatten(c) : c), []);
const result = getFlatten(arrays);
console.log(result);