亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 javascript forEach 循環不使用 splice 迭代完整數組

為什么 javascript forEach 循環不使用 splice 迭代完整數組

忽然笑 2021-12-02 15:41:50
我在玩 javascript.splice()和.forEach()方法,代碼工作正常,但沒有按預期提供輸出。問題是.forEach()運行半陣列然后退出。我期望的輸出是[['Apple'],['Banana'],['Mango'],['Pomegranate']]但輸出是[['Apple'],['Banana']]我無法弄清楚它為什么會這樣。從mdn它說該 .splice()方法更新數組的長度屬性。那么它應該可以正常工作。有什么辦法可以讓它像預期的那樣工作。出于某種原因,我只是不想使用.map()或任何其他功能。const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']const fruitsList = []function removeArrayItem(item,index){    let fruit = fruits.splice(0,1)    fruitsList.push(fruit)}fruits.forEach(removeArrayItem)console.log(fruitsList)
查看完整描述

3 回答

?
慕標琳琳

TA貢獻1830條經驗 獲得超9個贊

正如MDN 文檔中非常清楚地描述的那樣,該.forEach()方法在迭代開始之前確定將涉及的元素。


如果元素被添加到數組中,它們將不會被包含在迭代中。如果刪除元素,則將跳過后續元素?;旧嫌幸粋€用于選擇每個元素的內部索引,因此如果數組變短,則無法相應地調整該索引。


最重要的是,您編寫的代碼使得.forEach()回調忽略它的參數。它總是只去掉fruits數組的第一個元素。因此,在第一次迭代時,您會得到“Apple”,而數組現在只有三個元素。下一個迭代的元素將是“Mango”,而不是“Banana”,但因為代碼沒有注意item你得到源數組的第一個新元素。之后,數組只有兩個項目,因此迭代終止。


您將看到與此代碼完全相同的效果,這可能更清晰,因為該機制是可見的:


const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']

const fruitsList = []


for (let index = 0, len = fruits.length; index < len; index++) {

  if (index in fruits) {

      let fruit = fruits.splice(0,1)

      fruitsList.push(fruit)

  }

}

該if循環中的測試說明了一個重要的.forEach()行為:它跳過空數組的索引(即從未初始化為值的索引)。從 中.slice()刪除元素的調用fruits,因此在前兩次迭代之后,它甚至不會再嘗試執行任何.slice()調用,因為索引 2 和 3 將為空。


這樣做的正確方法,如果它是真正的代碼,將是


const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']

const fruitsList = fruits.map(function(fruit) {

  return [fruit];

});

fruits = []; // if you really want to empty it out

(而且=>函數會更簡潔。)


查看完整回答
反對 回復 2021-12-02
?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

Splice 修改源數組。

splice() 方法通過刪除或替換現有元素和/或在適當位置添加新元素來更改數組的內容。

來源:https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

這意味著當splice()應用于forEach()正在迭代的數組時,它被修改(變短),因此一段時間后它沒有元素可以迭代。


查看完整回答
反對 回復 2021-12-02
?
慕慕森

TA貢獻1856條經驗 獲得超17個贊

如果您看到每次迭代后所擁有的是從水果中刪除的數組,并且您將該數組推送到新列表中,那么您正在以錯誤的方式改變原始數組。


使用這種方法,您將保持索引完好無損,在拼接突變期間不會發生變化。


const fruits = ['Apple', 'Banana', 'Mango', 'Pomegranate']

const fruitsList = []


function removeArrayItem(item,index){

    let fruit = fruits.splice(index,1,'')

    fruitsList.push(fruit)

}


fruits.forEach(removeArrayItem)

console.log(fruitsList)

https://codepen.io/psyNiiM/pen/JjjNRaJT


查看完整回答
反對 回復 2021-12-02
  • 3 回答
  • 0 關注
  • 511 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號