Теперь я бы хотел сгладить массив несколькими слоями
Из другого решения и сети разработчика, существует эффективное решение:
var arr1 = [1,2,3,[1,2,3,4, [2,3,4]]];
function flattenDeep(arr1) {
return arr1.reduce((acc, val) => Array.isArray(val) ? acc.concat(flattenDeep(val)) : acc.concat(val), []);
}
flattenDeep(arr1);// [1, 2, 3, 1, 2, 3, 4, 2, 3, 4]
Однако есть пара вопросов о теории, которые я хочу задать:
1. В моем понимании, функция начинается с начального значения acc, а затем продолжает цикл по всему элементу, чтобы увидеть, является ли он массивом или нет.
В этом случае первые 3 элемента равны 1,2,3 - поэтому не являются массивом и будут накапливаться и возвращаться в виде массива.
Но начните с четвертого элемента, он возвращает
Array.isArray(arr1[3])
(5) [1, 2, 3, 4, Array(3)]
В этом случае запускается условие acc.concat (flattenDeep (val)), которое является рекурсией функции. Как это условие помогает сгладить массив?
А для [] сзади, если я правильно понимаю, это указывает на то, что возвращаемая форма результата result должна быть массивом?
И последнее, но не менее важное: какие-нибудь полезные ссылки по этим темам, которые мне следует искать?
Май, спасибо за вашу помощь!
Дальнейшая разработка:
скажем, теперь значение val в приведенной выше функции приведения равно [1, 2, 3, 4, [[2,3,4]]].
В этом первом раунде проверки элементы 1, 2, 3, 4 не являются массивом, но последний элемент все еще делает, и это делает весь аргумент все еще массивом. Для следующего раунда рекурсии, нужно ли просто взять элемент [[2,3,4]]] и дополнительно оценить элементы внутри этого массива?
Или с этим примером, каким будет результат первого, второго и третьего раунда процесса рекурсии?