在条件下删除数组元素



我想知道如何在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;
});

您可以使用数组过滤器方法。

代码如下所示:

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

您可以将自己的方法添加到执行类似操作的Arrayfilter如果它不适合您。

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.filter() ,它的作用恰恰相反:

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

您可以使用 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]

使其成为带有箭头功能的单行:

ar = ar.filter(i => i > 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);

查看示例实时示例

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

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 = ar.filter(item => item < 4);

我喜欢这类问题,也喜欢与我不同的版本...... :)

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;
}

对于就地删除,我的解决方案是

ar.filter(item => !(item > 3))
  .forEach(obsoleteItem => ar.splice(ar.indexOf(obsoleteItem), 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 .

<小时 />

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

正确的方法之一,不止 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。

最新更新