簡體   English   中英

為什么這個 for 循環沒有返回預期的 output?

[英]why is this for loop not returning the intended output?

這只是課程中的一個練習,這個應用程序從水果數組中選擇一個隨機水果,然后 removeItem() function 應該從數組中刪除那個水果並返回修改后的數組,但我得到一個奇怪的 output, function 不工作。

問題可以看這里

 function randomFruit(importedArray) { let random = Math.floor(Math.random() * importedArray.length); return importedArray[random]; } function removeItem(importedArray, item) { for (let i = 0; i < importedArray.length; i++) { if (importedArray[i] === item) { importedArray.splice(i, 1); return [...importedArray.slice(0, i), ...importedArray.slice(i + 1)]; } else { return "not found"; } } } function makeFruitArray() { var foods = ["", "", "", "", ""]; return foods; } let fruitArray = makeFruitArray(); let fruitItem = randomFruit(fruitArray); let remaining = removeItem(fruitArray, fruitItem); console.log({fruitArray, fruitItem, remaining});

removeItem中有兩個問題 function -

  1. 如果隨機數不是數組中的第一項,則 function 返回not found 它根本不會運行第二個循環,因為您的 function 在第一次迭代后返回not found

  2. splice方法更新原始數組。 當您將fruitArray傳遞給removeItem方法時,它會作為引用傳遞並在 function 中使用splice更新它也會更新實際數組。

從數組中刪除項目的最簡單和最安全的方法是 -

function removeItem(importedArray, item) {
  const filteredArray = importedArray.filter((each) => each !== item);
  if (filteredArray.length === 0) return 'Not Found';
  return filteredArray;
}

正如 himayan 所說,問題在於 splice 已經改變了數組。

這是我的解決方案:

function removeItem(importedArray, item) {
  for (let i = 0; i < importedArray.length; i++) {
    if (importedArray[i] === item) {
      importedArray.splice(i, 1);
      break;
    }
  }

  return importedArray;
}

您的移除項目 function 無法正常工作。 與其編寫循環並拼接數組來創建一個新數組,不如使用filter方法

function removeItem(importedArray, item) {
    let newArray = importedArray.filter(function (element) {
        return element !== item;
    });
    return newArray;
}

有兩個主要問題:

  • removeItem中的for循環總是在第一次迭代時返回
  • 您在從中刪除項目時正在修改初始數組

我還刪除了用於重現您的問題的所有不必要的代碼。 請閱讀如何提問以確保您正在幫助他人幫助您。

 function randomFruit(importedArray) { let random = Math.floor(Math.random() * importedArray.length); return importedArray[random]; } function removeItem(importedArray, item) { for (let i = 0; i < importedArray.length; i++) { if (importedArray[i] === item) { // Don't modify the original array since we want to // display the original fruits return [...importedArray.slice(0, i), ...importedArray.slice(i + 1)]; } } // Error condition goes outside the loop, not inside. return null; } function makeFruitArray() { var foods = ["", "", "", "", ""]; return foods; } let fruitArray = makeFruitArray(); let fruitItem = randomFruit(fruitArray); let remaining = removeItem(fruitArray, fruitItem); console.log({fruitArray, fruitItem, remaining});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM