以下代碼可以很好地展平深度嵌套的陣列
const arr = [[2, [4, 9]], 6, [5,32]];;
const finalArr = [];
function flattenArr(currArr) {
for (var el of currArr) {
if (Array.isArray(el)) {
finalArr.concat(flattenArr(el));
} else {
finalArr.push(el);
}
}
return finalArr;
}
flattenArr(arr);
console.log(finalArr); // Output:[2, 4, 9, 6, 5, 32]
但是如果我替換concat為push,它會中斷并給出以下輸出:
[2, 4, 9, [circular object Array], [circular object Array], 6, 5, 32, [circular object Array]]
誰能幫我理解為什么?還有,什么[circular object Array]意思?
uj5u.com熱心網友回復:
首先,我想指出,concat您的第一個代碼實際上什么都不做。Concat 創建一個新陣列并回傳該陣列,但您沒有使用回傳的陣列。所以如果你finalArr.concat(flattenArr(el));用flattenArr(el);你的代碼替換仍然可以作業。
const arr = [[2, [4, 9]], 6, [5,32]];
const finalArr = [];
function flattenArr(currArr) {
for (var el of currArr) {
if (Array.isArray(el)) {
flattenArr(el)
} else {
finalArr.push(el);
}
}
return finalArr;
}
flattenArr(arr);
console.log(finalArr); // Output:[2, 4, 9, 6, 5, 32]
但是當你把它切換到 時.push, push確實會做一些事情。它將插入到現有finalArr陣列中。它要插入的東西是由 . 回傳的東西flattenArr(el),即finalArr. 因此,您將陣列推入自身,最終以回圈參考結束(陣列包含自身,包含自身,包含自身等),這就是某些控制臺將其記錄為 [回圈物件陣列] 的原因。
您遇到的核心問題是您只使用一個陣列來計算輸出:finalArr您在第 2 行定義的名為 的陣列。這是解決陣列展平問題的一種方法,正如您的第一個代碼所示。但是,如果您更喜歡通過遞回展平子陣列,然后將它們與 push(或 concat)組合,那么每次遞回時,您都需要創建一個新陣列。
第二個問題是,當您執行 時.push,您需要將陣列的各個專案作為單獨的引數傳遞,而不是將整個陣列作為一個引數傳遞。這可以通過展開語法 ( ...) 來完成。
例如:
const arr = [[2, [4, 9]], 6, [5,32]];
function flattenArr(currArr) {
const result = []; // Creating a brand new array
for (var el of currArr) {
if (Array.isArray(el)) {
result.push(...flattenArr(el)); // Note that i used spread syntax here
} else {
result.push(el);
}
}
return result;
}
const finalArr = flattenArr(arr);
console.log(finalArr);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/507838.html
標籤:javascript 递归
下一篇:Sqlserver余額表更新遞回
