从数组中删除多个参数

Removing multiple arguments from an array

提问人:vinnyWebDev 提问时间:1/13/2023 最后编辑:Ruan MendesvinnyWebDev 更新时间:1/13/2023 访问量:62

问:

我一直在尝试编写一个函数,该函数将数组作为第一个参数,然后是一个或多个其他参数,它们是数字。该函数的目的是检查数组中是否存在这些数字,如果存在,则将其删除。

我尝试了以下方法,但结果不是我预期的。 期望的结果是将 3 和 2 从数组中删除,留下 [1,4]。相反,只删除了 2 个,最终结果为 [1,3,4]。我已经为此苦苦挣扎了一段时间,并希望您能提供任何反馈。我知道这一点,这是迄今为止让我难倒的第一个问题!

function test(myArray, ...checkNums) {
  for (let num in checkNums) {
    for (let num2 in myArray) {
      if (myArray[num] == checkNums[num2]) {
        myArray.splice(num, 1);
      }
    }
  }
  return myArray;
}

const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr})

JavaScript的

评论

0赞 RobG 1/13/2023
您混淆了 numnum2,请使用 .但是用于..不建议使用数组,因为它会访问所有可枚举的属性,而不仅仅是索引。如果有人添加了可枚举的非数字属性,您可能会得到意外的结果。myArray[num2] == checkNums[num]

答:

0赞 Samathingamajig 1/13/2023 #1

最简单的方法是过滤数组以仅保留不在 中的值。使用 a 可以提供更好的性能(根据实现的不同,与 Array 相比,Set 的查找是 OR 或任何子线性的)。checkNumsSetO(1)O(log n)O(n)

function test(myArray, ...checkNums) {
  const checkNumsSet = new Set(checkNums);
  return myArray.filter((num) => !checkNumsSet.has(num));
}

const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr})

评论

0赞 Ruan Mendes 1/13/2023
我不明白为什么您需要将其转换为集合,这可能是性能改进,但似乎为时过早的优化。
0赞 Ruan Mendes 1/13/2023 #2

您的代码正在删除项,因此在删除元素后,索引变量已过时。最简单的解决方法是向后迭代。

此外,应避免使用 for in 遍历数组

最后,您的数组只是修改了传入的内容,但您从未保留对它的引用,我将返回修改后的数组。

function test(myArray, ...checkNums) {
  for (let checkNumsIndex = checkNums.length - 1; checkNumsIndex >=0; checkNumsIndex--) {
    for (let myArrayIndex = myArray.length - 1; myArrayIndex >=0; myArrayIndex--) {
      if (myArray[myArrayIndex] == checkNums[checkNumsIndex]) {
        myArray.splice(myArrayIndex, 1);
      }
    }  
  }

  return myArray;
}

const arr = test([1, 2, 3, 4], 3, 2);
console.log({arr});

更直接的做法是使用 filterincludes。这不会像您的示例那样在测试数组边界之外的值。

function removeElements(myArray, ...checkNums) {
  return myArray.filter((num) => !checkNums.includes(num));
}

const arr = removeElements([1, 2, 3, 4], 3, 2);
console.log({arr});

0赞 Rhys Mills 1/13/2023 #3

使用 和 作为数组,您可以使用基于以下条件的过滤器:myArraycheckNums.includes

const myArray = [1,2,3,4];
const checkNums = [3,4];

const filterNums = (nums, checkNums) => {
  return nums.filter(num => !checkNums.includes(num));
}

console.log(filterNums(myArray, checkNums));

0赞 Mara Black 1/13/2023 #4

您可以使用 see for..在VS中...of 为了遍历你的参数,检查数组中是否存在该数字,如果存在,则在索引号处for...ofsplice

function test(myArray, ...checkNums) {
  //get the elements from ...checkNums
  for (let num of checkNums) {
    //check if your number exist in array
    if (myArray.includes(num)) {
      const indexOfNum = myArray.indexOf(num);
      //if it exists splice at found index of your umber
      myArray.splice(indexOfNum, 1)
    }
  }
  return myArray;
}

const result = test([1, 2, 3, 4], 3, 2);
console.log(result)