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ď č. 1Pri 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 {