/ / Sploštiť vnorené polia pomocou rekurzie v JavaScripte - javascript, rekurzia

Vyrovnanie vnorených polí pomocou rekurzie v jazyku JavaScript - javascript, recursion

Snažím sa sploštiť vnorené polia pri zachovaní poriadku, napr. [[1, 2], 3, [4, [[5]]]] by sa mala previesť na [1, 2, 3, 4, 5].

Snažím sa na to použiť rekurziu, ale nižšie uvedený kód nefunguje a nerozumiem prečo. Viem, že existujú aj iné spôsoby, ako to urobiť, ale rád by som vedel, čo je s tým zlé.

function flatten (arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
flatten(arr);
} else {
newArr.push(arr[i]);
}
}
return newArr;
}

flatten([[1, 2], 3, [4, [[5]]]]);

Vďaka

odpovede:

11 pre odpoveď č. 1

Pri volaní flatten rekurzívne, musíte prejsť arr[i] k nej a potom výsledok concat pomocou newArr. Nahraďte teda tento riadok:

flatten(arr);

s:

newArr = newArr.concat(flatten(arr[i]));

3 pre odpoveď č. 2

Tu je bežný vzor, ​​ktorý pravidelne používam na vyrovnávanie vnorených polí a ktorý mi vzhľadom na jeho funkčný programovací charakter pripadá o niečo čistejší:

var flatten = (arrayOfArrays) =>
arrayOfArrays.reduce((flattened, item) =>
flattened.concat(Array.isArray(item) ? flatten(item) : [item]), []);

Alebo pre tých, ktorí majú radi kratšiu a menej čitateľnú verziu pre code golf alebo tak nejak:

var flatten=a=>a.reduce((f,i)=>f.concat(Array.isArray(i)?flatten(i):[i]),[]);

1 pre odpoveď č. 3

Tu je niekoľko pracovných kódov

function flatten (arr) {
var newArr = [];
for (var i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
var temp = flatten(arr[i]);
temp.forEach(function(value){ newArr.push(value); })
} else {
newArr.push(arr[i]);
}
}
return newArr;
}


1 pre odpoveď č. 4

Havent to otestoval, túto časť zahryzol

if (Array.isArray(arr[i])) {
flatten(arr);
} else {

Zdá sa, že má byť ako

if (Array.isArray(arr[i])) {
flatten(arr[i]);
} else {