我想知道如何在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;
});
答案 0 :(得分:48)
您可以使用Array filter method。
代码如下所示:
ar = [ 1, 2, 3, 4 ];
ar = ar.filter( function(item) {
return !(item > 3);
});
答案 1 :(得分:32)
如果Array
对您不起作用,您可以将自己的方法添加到类似filter
的{{1}}。
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
或抓住下一个项目,因为您的工作方式是向左而不是正确。
答案 2 :(得分:24)
你可以使用Array.filter()
,反之亦然:
ar.filter(function(item, idx) {
return item <= 3;
});
答案 3 :(得分:2)
如果条件也适用于对象属性
,只需编写以下示例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
答案 4 :(得分:2)
使其具有箭头功能的单线:
ar = ar.filter(i => i > 3);
答案 5 :(得分:1)
我喜欢这些问题,也只是和我不同的版本......:)
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;
}
答案 6 :(得分:1)
您可以使用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]
答案 7 :(得分:1)
如果您只需要删除一个项目,并且您确定该项目存在,则可以使用此单行:
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