JavaScript - 根据条件删除数组元素

138
我想知道如何在Javascript中实现一种方法,该方法可删除所有满足特定条件的数组元素(最好不使用jQuery)。
例如:
ar = [ 1, 2, 3, 4 ];
ar.removeIf( function(item, idx) {
    return item > 3;
});
上面的代码会遍历数组中的每个项,并删除符合条件(在示例中为item > 3)的所有项。
我刚开始学习javascript,想知道是否有一种简洁高效的方法来完成此操作。
--更新--
如果条件也可以用于对象属性的话,那就太好了。例如:
ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return item.str == "c";
});

如果item.str == "c",则该项将被删除。

--更新2--

如果索引条件也能生效就太好了。

例如:

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
    return idx == 2;
});
11个回答

1

错误的方法

首先,任何建议使用filter的答案实际上并没有删除该项。以下是一个快速测试:

var numbers = [1, 2, 2, 3];
numbers.filter(x => x === 2);
console.log(numbers.length);

在上面的代码中,numbers 数组将保持不变(不会删除任何内容)。filter 方法返回一个新数组,其中包含满足条件 x === 2 的所有元素,但原始数组保持不变。
当然,你可以这样做:
var numbers = [1, 2, 2, 3];
numbers = numbers.filter(x => x === 2);
console.log(numbers.length);

但那只是将一个新的数组赋值给numbers


从数组中删除项目的正确方法

其中一种正确的方法(不止一种),是按照以下方式进行。请注意,此处的示例有意重复了某些项,以便考虑去除重复项。

var numbers = [1, 2, 2, 3];

// Find all items you wish to remove
// If array has objects, then change condition to x.someProperty === someValue
var numbersToRemove = numbers.filter(x => x === 2);

// Now remove them
numbersToRemove.forEach(x => numbers.splice(numbers.findIndex(n => n === x), 1));

// Now check (this is obviously just to test)
console.log(numbers.length);
console.log(numbers);

现在你会注意到length返回2,表示数组中只剩下数字1和3。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接