我正在創建一個 Array.flat() 方法的 polyfill,但是,在檢查回圈元素是一個陣列并且需要進一步展平之后,我在內部呼叫該函式時遇到了問題。當撰寫不是原型的代碼時,展平是正確的,但是當我嘗試創建原型函式時,我無法獲得展平的陣列。我很確定這個問題與“this”關鍵字有關。請看一下我的代碼。
這是代碼
let arrayFlat = [1, 2, 3, [4, 5, 6, [7, 8, [9]], 10, [11, 12]], [13, [14, 15]]];
const flatArray = (array) => {
let output = [];
const flatten = (array) => {
for (let i = 0; i < array.length; i ) {
if (Array.isArray(array[i])) {
flatten(array[i]);
} else {
output.push(array[i]);
}
}
return output;
};
return flatten(array);
};
Array.prototype.myFlat = function () {
let output = [];
for (let i = 0; i < this.length; i ) {
if (Array.isArray(this[i])) {
console.log(this[i]);
this[i].myFlat();
} else {
output.push(this[i]);
}
}
return output;
};
uj5u.com熱心網友回復:
在您的第一段代碼中,您創建了一個output陣列。當您遞回呼叫flatten時,代碼總是推送到完全相同的output陣列,該陣列位于flatten. 然后,一旦一切完成,您就回傳該陣列。
在第二個代碼中,每次遞回時都會創建一個新陣列。每次遞回都將創建一個陣列,將自身展平,然后回傳該新陣列。但是回傳值被忽略了,所以這些值不會去任何地方。
你有幾個選擇
- 使代碼與您的第一個代碼基本相同,具有用于執行遞回的內部函式,以及所有人使用的閉包變數:
Array.prototype.myFlat = function () {
let output = [];
const flatten = (array) => {
for (let i = 0; i < array.length; i ) {
if (Array.isArray(array[i])) {
flatten(array[i]);
} else {
output.push(array[i]);
}
}
return output;
};
return flatten(this);
}
- 遞回時將輸出陣列作為引數傳遞:
// VVVVVV--- added parameter
Array.prototype.myFlat = function (output = []) {
for (let i = 0; i < this.length; i ) {
if (Array.isArray(this[i])) {
this[i].myFlat(output); // <---- forward the array along
} else {
output.push(this[i]);
}
}
return output;
};
- 繼續擁有單獨的陣列,然后在堆疊展開時將它們合并在一起:
Array.prototype.myFlat = function () {
let output = [];
for (let i = 0; i < this.length; i ) {
if (Array.isArray(this[i])) {
output.push(...this[i].myFlat()); // <---- added output.push
} else {
output.push(this[i]);
}
}
return output;
};
uj5u.com熱心網友回復:
我強烈支持保持類盡可能薄,盡可能包裝功能介面 -
function myFlat(t) {
return Array.isArray(t)
? t.reduce((r, v) => r.concat(myFlat(v)), [])
: [t]
}
Array.prototype.myFlat = function() { return myFlat(this) }
console.log([1,[2,[3],4],[[5]],6,[[[7]]]].myFlat())
// [ 1, 2, 3, 4, 5, 6, 7 ]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/461001.html
標籤:javascript 数组 递归
上一篇:找到覆寫所有段的最小點數
