我从数组中删除偶数的函数仍然返回偶数

My function to remove even values from an array is still returning an even number

我正在尝试从数组中删除偶数。我写的函数仍然返回一个包含偶数的索引。我不确定为什么我会出现这种行为。有什么想法吗?

let arr = [6, 3, 19, 43, 12, 66, 43];

const removeEvenValues = arr => {
  arr.forEach((num, i) => {
    if(num % 2 === 0) arr.splice(i, 1);
  });
};

removeEvenValues(arr); // arr becomes [3, 19, 43, 66, 43] but should become [3, 19, 43, 43]

不要 splice 遍历数组 - 这会 原地 改变它。例如,如果您从数组 [2, 4, 6] 开始,并在第一次迭代中删除索引 0 处的项目,则数组将为 [4, 6],然后您将进入第二次迭代,其中i1。然后,您将删除第一个索引处的项目,即 6,导致数组变为 [4].

每次删除项目时,您当前的方法都会忘记重新检查属于已删除项目索引的 项目。

这很令人困惑。要么使用 for 循环并从数组的 end 开始,要么(甚至更好)使用 .filter:

let arr = [6, 3, 19, 43, 12, 66, 43];

const removeEvenValues = arr => arr.filter(num => num % 2 !== 0);

console.log(removeEvenValues(arr)); 

如果您改变现有数组(除非绝对必要,否则这通常不是一个好主意),那么:

let arr = [6, 3, 19, 43, 12, 66, 43];

const removeEvenValues = arr => {
  for (let i = arr.length - 1; i >=0; i--) {
    if (arr[i] % 2 === 0) {
      arr.splice(i, 1);
    }
  }
  return arr;
}

console.log(removeEvenValues(arr));