Javascript-条件移除数组元素

我想知道如何在 javascript 中实现一个方法,删除数组中清除某个条件的所有元素。(最好不要使用 jQuery)

前女友。

ar = [ 1, 2, 3, 4 ];
ar.removeIf( function(item, idx) {
return item > 3;
});

上面的代码将遍历数组中的每个条目,并删除所有 return true中的条件(在示例中,条目 > 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"项目将被删除的地方

—— update2——

如果索引条件也能起作用就好了。

前女友。

ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
ar.removeIf( function(item, idx) {
return idx == 2;
});
164443 次浏览

你可以使用 Array.filter(),它的作用正好相反:

ar.filter(function(item, idx) {
return item <= 3;
});

你可以使用 Array filter method

代码应该是这样的:

ar = [1, 2, 3, 4];
ar = ar.filter(item => !(item > 3));
console.log(ar) // [1, 2, 3]

You could add your own method to Array that does something similar, if filter does not work for you.

Array.prototype.removeIf = function(callback) {
var i = 0;
while (i < this.length) {
if (callback(this[i], i)) {
this.splice(i, 1);
}
else {
++i;
}
}
};

对我来说,这是 JavaScript 最酷的特性之一。伊恩指出了一个更有效的方法来做同样的事情。考虑到它是 JavaScript,每一点都有帮助:

Array.prototype.removeIf = function(callback) {
var i = this.length;
while (i--) {
if (callback(this[i], i)) {
this.splice(i, 1);
}
}
};

这避免了甚至需要担心更新 length或捕获下一个项目,因为您的工作方式是向左而不是向右。

我喜欢这类问题,只是和我的问题有所不同... :)

Array.prototype.removeIf = function(expression) {
var res = [];
for(var idx=0; idx<this.length; idx++)
{
var currentItem = this[idx];
if(!expression(currentItem))
{
res.push(currentItem);
}
}
return res;
}


ar = [ 1, 2, 3, 4 ];
var result = ar.removeIf(expCallBack);




console.log(result);
function expCallBack(item)
{
return item > 3;
}

如果条件也可以对对象属性起作用,只需编写下面的示例

var ar = [ {num:1, str:"a"}, {num:2, str:"b"}, {num:3, str:"c"} ];
var newArray = [];
for (var i = 0, len = ar.length; i<len; i++) {
if (ar[i].str == "b")
{newArray.push(ar[i]);};
};
console.log(newArray);

参见示例 实例

你可以使用 删除

var array = [1, 2, 3, 4];
var evens = _.remove(array, function(n) {
return n % 2 == 0;
});


console.log(array);
// => [1, 3]


console.log(evens);
// => [2, 4]

使它成为一个具有箭头功能的一行程序:

ar = ar.filter(i => i > 3);

如果您需要删除一个项目,并且您确信该项目存在,那么您可以使用以下一行程序:

ar.splice(ar.findIndex(el => el.id === ID_TO_REMOVE), 1);


// or with custom method:
let ar = [ {id:1, str:"a"}, {id:2, str:"b"}, {id:3, str:"c"}, {id:4,str:"d"} ];
ar.removeById = id => ar.splice(ar.findIndex(el => el.id === id), 1);
ar.removeById(ID_TO_REMOVE);

Http://jsfiddle.net/oriadam/72kgprw5/

只有 ES6

我对数字数组的解决方案是:

ar.filter(item => item < 4);

For the in-place remove, my solution is

ar.filter(item => !(item > 3))
.forEach(obsoleteItem => ar.splice(ar.indexOf(obsoleteItem), 1));

Incorrect way

首先,建议使用 filter的任何答案实际上都不会删除该项。这里有一个快速测试:

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

In the above, the numbers array will stay intact (nothing will be removed). The filter method returns a new array with all the elements that satisfy the condition x === 2 but the original array is left intact.

当然,你可以这样做:

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

但这只是将一个新数组赋给 numbers


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

正确的方法之一,有多于1种,就是按照下面的方法来做。请记住,这里的例子故意有重复的项目,以便删除重复可以考虑。

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。