我从数组中删除偶数的函数仍然返回偶数
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]
,然后您将进入第二次迭代,其中i
是 1
。然后,您将删除第一个索引处的项目,即 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));
我正在尝试从数组中删除偶数。我写的函数仍然返回一个包含偶数的索引。我不确定为什么我会出现这种行为。有什么想法吗?
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]
,然后您将进入第二次迭代,其中i
是 1
。然后,您将删除第一个索引处的项目,即 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));