103

我想知道如何在 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"

--更新2 --

如果索引条件也可以工作,那就太好了。

前任。

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

9 回答 9

146

您可以使用数组过滤方法

代码如下所示:

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

于 2013-04-14T05:02:23.547 回答
60

如果对您不起作用,您可以添加自己的方法Array来做类似的事情filter

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

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

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

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

于 2013-04-14T05:08:39.937 回答
42

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

ar.filter(function(item, idx) {
    return item <= 3;
});
于 2013-04-14T05:01:01.067 回答
7

使其成为具有箭头功能的单线:

ar = ar.filter(i => i > 3);
于 2020-01-29T11:56:54.047 回答
7

您可以使用lodash.remove

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]
于 2019-01-23T06:43:58.810 回答
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);

查看示例Live Example

于 2014-08-26T09:04:31.737 回答
3

我喜欢这些类型的问题,只是和我不同的版本...... :)

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;
}
于 2013-04-14T05:17:17.107 回答
2

如果您需要删除一个项目,并且您确定该项目存在,您可以使用这个单行:

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

于 2021-01-24T15:24:35.103 回答
2

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

ar.filter(item => item < 4);
于 2022-01-20T11:17:26.533 回答