Понятие о плоской рекурсии использования с приведениями и конкатами - PullRequest
0 голосов
/ 09 сентября 2018

Теперь я бы хотел сгладить массив несколькими слоями

Из другого решения и сети разработчика, существует эффективное решение:

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]]] и дополнительно оценить элементы внутри этого массива?

Или с этим примером, каким будет результат первого, второго и третьего раунда процесса рекурсии?

1 Ответ

0 голосов
/ 09 сентября 2018

Вторым аргументом в методе Reduce является начальное условие.Если ничего не указано, первый acc будет первым элементом массива (см. Array.prototype.reduce на mdn).

Я не уверен насчет оператора But there is nth to indicate the reduction of the array.Вы вызываете функцию рекурсивно, пока не найдете то, что не является массивом, а затем возвращаете это значение.

Найдите стек вызовов js, поймите, как js складывает функции, вы даже можете нарисовать его,это определенно поможет, потому что это не простой случай :)

...