繁体   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