Я столкнулся с this stackoverflow question о рекурсивном выравнивании массива JS. Вот принятый ответ:Рекурсивный Function.prototype.apply концептуальное понимание
function flatten() {
var flat = [];
for (var i = 0; i < arguments.length; i++) {
if (arguments[i] instanceof Array) {
flat.push.apply(flat, flatten.apply(this, arguments[i]));
} else {
flat.push(arguments[i]);
}
}
return flat;
}
flatten([[1], 2, [3, 4]]); // returns [1, 2, 3, 4]
У меня возникли проблемы с пониманием, как flat.push.apply(...)
и flatten.apply(...)
работы.
Я понимаю, что функция будет только выйти, если нет элементов в массиве - сами массивы. Я также понимаю, что Function.prototype.apply()
позволяет вам вызвать функцию, используя массив аргументов.
Я не понимаю, почему вы используете flat.push...
, если flat
будет установлен на []
при каждой итерации функции. Кроме того, какое значение имеет значение flat
как контекст this
?
Может кто-нибудь помочь объяснить, как работает flat.push.apply(flat, flatten.apply(this, arguments[i]));
?
«* если' flat' будет установлен на '[]' для каждой итерации функции. * "- это не итерация, это рекурсия. И каждый вызов имеет свои собственные локальные переменные. – Bergi
"* какое значение имеет установка' flat', как этот контекст? * "- это контекст метода' push' * *, который является массивом, который будет нажат. Так же, как если вы регулярно вызываете 'flat.push (...)' * на 'flat' *. – Bergi
'flat' не устанавливается на каждую итерацию, она устанавливается только один раз, перед циклом. – dandavis