下面的代碼應該回傳空陣列,但它回傳的是 Banana,Banana,Banana
const fruits = ["Banana", "Banana", "Banana", "Banana", "Banana", "Banana"];
fruits.map((ele) => {
if (ele === "Banana") {
fruits.splice(0, 1)
}
})
document.getElementById("demo").innerHTML = fruits;
<div id="demo"></div>
uj5u.com熱心網友回復:
這實際上是在做你所說的。
的實作array.map可能是這樣的:
array.prototype.map = function(transform) {
let output = [];
for(index = 0; index < this.length; index) {
output.push(transform(this[index]));
}
return output;
}
回圈會是這樣的:
Index = 0, length = 6, remove first itemIndex = 1, length = 5, remove first remaining itemIndex = 2, length = 4, remove first remaining itemIndex = 3, length = 3, terminate loop
這就是為什么它只洗掉三個專案。
這樣做的結果array.map是不適合該作業的功能。
有多種方法可以實作這一點。一種方法是向后遍歷陣列:
for(index = fruits.length-1; index >= 0; --index) {
if(fruits[index] === 'Banana') {
fruits.splice(index, 1);
}
}
uj5u.com熱心網友回復:
.forEach()向前移動(例如0...5),因此如果洗掉了一個元素,那么長度會隨著長度減小到長度的一半而減小,索引參考將大于長度 - 因此陣列的一半仍然存在。
當減少陣列的長度時,進入反向方向(例如5...0)。下面的示例使用反向 for 回圈和.pop().
const fruits = ["Banana", "Banana", "Banana", "Banana", "Banana", "Banana"];
for (let i = fruits.length; i >= 0; i--) {
if (fruits[i] === "Banana") {
fruits.pop();
}
}
console.log(fruits);
<div class="demo"></div>
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/420421.html
標籤:
上一篇:CSS浮動問題(發現奇怪的行為)
