关于javascript:javascript – 在条件下删除数组元素

javascript - remove array element on condition

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

前任。

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

上面将遍历数组中的每个项,并删除条件(在示例中,项>3)中return true的所有项。

我刚开始使用JavaScript,我想知道是否有人知道一种简单有效的方法来完成这项工作。

--更新——

如果该条件也可以用于对象属性,那也将是非常好的。

前任。

1
2
3
4
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"将删除该项

--UpDea2——

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

前任。

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

可以使用数组过滤方法。

代码如下:

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


如果filter不适用于您,您可以将自己的方法添加到执行类似操作的Array中。

1
2
3
4
5
6
7
8
9
10
11
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,每一位都有助于:

1
2
3
4
5
6
7
8
Array.prototype.removeIf = function(callback) {
    var i = this.length;
    while (i--) {
        if (callback(this[i], i)) {
            this.splice(i, 1);
        }
    }
};

这样就不必担心更新length或捕获下一个项目,因为您需要向左而不是向右工作。


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

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


如果条件也可以用于对象属性,那么只需编写以下示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var ar = [ {num:1, str:"a
<hr>
<p>
You can use lodash.remove
</p>

[cc lang="
javascript"]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]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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;
}