function isArr(el) {
return Array.isArray(el)
}
function concat3() {
let res = []
for (let i = 0; i < arguments.length; i += 1) {
if (isArr(arguments[i])) {
res = res.concat(concat3.apply(null, arguments[i]))
} else {
res.push(arguments[i])
}
}
return res
}
Вот этот момент “хитрый”. Он моделирует сиуацию вида “если аргумент args[i] - массив, то вызови concat3 с элементами этого массива как аргментами. Получишь в итоге массив и его сконкатенируй с масивом результатов.”.
if (isArr(args[i])) {
res = res.concat(concat3.apply(null, args[i]))
Есть еще условно брутальный подход. Он “играет” с тем как себя ведет метод concat, и будет корректно работать только для js (или других языков с таким-же набором функционала методов).
function concat3() {
let res = [...arguments]
while (res.some(Array.isArray)) {
res = Array.prototype.concat.apply([], res)
}
return res
}
первую реализацию в принципе понял. Что-то типа такого и пытался сделать. Единственное не совсем ясна специфика вызова через apply c null указателем. Я просто пушил результат рекурсивного вызова, но все время ловил стэк оверфлоу. Что можно читануть по теме?
Или это в разделах дальше (там же еще я так понимаю дальше функции разбираются)
вторую реализацию не понял вообще. Но это наверное пока для меня сложная материя )))
вернусь к ней попозже. После чтива блога Soshnikov пока прихожу в себя :)