假设我有以下代码:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
我想要从该数组中移除 id=3 的元素。是否有一种方法可以不使用splice来实现呢?也许可以使用underscore或类似的东西吗?
谢谢!
假设我有以下代码:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
我想要从该数组中移除 id=3 的元素。是否有一种方法可以不使用splice来实现呢?也许可以使用underscore或类似的东西吗?
谢谢!
只使用纯JavaScript,这个问题已经有答案了:按对象属性从数组中删除对象。
使用underscore.js,你可以将 .findWhere
和 .without
结合起来使用:
var arr = [{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}, {
id: 3,
name: 'c'
}];
//substract third
arr = _.without(arr, _.findWhere(arr, {
id: 3
}));
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
_.filter
或本机的Array.prototype.filter
函数(就像在其他问题中所示)。 那么,您只需要遍历数组一次,而不是像这里可能遍历两次。.splice
。 这也在其他问题中显示,并且underscore似乎没有提供任何有用的函数。_.reject
看起来更好一些。 - Tarik您可以使用 Underscore .filter
var arr = [{
id: 1,
name: 'a'
}, {
id: 2,
name: 'b'
}, {
id: 3,
name: 'c'
}];
var filtered = _(arr).filter(function(item) {
return item.id !== 3
});
也可以写作:
var filtered = arr.filter(function(item) {
return item.id !== 3
});
var filtered = _.filter(arr, function(item) {
return item.id !== 3
});
你还可以使用.reject
_()
会创建一个包装器,让你可以调用 underscore 方法来操作集合。 - Sushanth --使用 Underscore _.reject()
方法:
arr = _.reject(arr, function(d){ return d.id === 3; });
arr = _.reject(arr, d => d.id === 3 );
这个方法。 - greenafricanUnderscore 的 _without() 方法非常适合从数组中移除项,特别是如果您有要移除的对象。
返回删除所有值实例后的数组副本。
_.without(["bob", "sam", "fred"], "sam");
=> ["bob", "fred"]
还可以与更复杂的对象一起使用。
var bob = { Name: "Bob", Age: 35 };
var sam = { Name: "Sam", Age: 19 };
var fred = { Name: "Fred", Age: 50 };
var people = [bob, sam, fred]
_.without(people, sam);
=> [{ Name: "Bob", Age: 35 }, { Name: "Fred", Age: 50 }];
如果您没有要删除的项,只有它的属性,您可以使用_.findWhere
,然后使用_.without
。
{ Name:“Sam”,Age:19 }
传递给without而不是变量sam,则它将不再起作用。 [Fiddle](https://jsfiddle.net/mx8k13vd/) - Adam如果您正在过滤字符串并且正在寻找不区分大小写的筛选器,请注意谨慎。 _.without() 是区分大小写的。您也可以使用如下所示的 _.reject()。
var arr = ["test","test1","test2"];
var filtered = _.filter(arr, function(arrItem) {
return arrItem.toLowerCase() !== "TEST".toLowerCase();
});
console.log(filtered);
// ["test1", "test2"]
var filtered1 = _.without(arr,"TEST");
console.log(filtered1);
// ["test", "test1", "test2"]
var filtered2 = _.reject(arr, function(arrItem){
return arrItem.toLowerCase() === "TEST".toLowerCase();
});
console.log(filtered2);
// ["test1", "test2"]
其他答案会创建一个新的数组副本,如果您想原地修改数组,可以使用:
arr.splice(_.findIndex(arr, { id: 3 }), 1);
但这假定该元素始终在数组中找到(因为如果未找到,它仍将删除最后一个元素)。为了安全起见,您可以使用:
var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
arr.splice(index, 1);
}
您可以像这样使用纯JavaScript的Array#filter
方法:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var filteredArr = arr.filter(obj => obj.id != 3);
console.log(filteredArr);
或者,使用 Array#reduce
和 Array#concat
方法,可以像这样实现:
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var reducedArr = arr.reduce((accumulator, currObj) => {
return (currObj.id != 3) ? accumulator.concat(currObj) : accumulator;
}, []);
console.log(reducedArr);
注意:
_.omit(arr, _.findWhere(arr, {id: 3}));
我的两分钱意见
object
上工作并返回一个object
。因此,在处理Arrays
时,我们可能希望在删除元素后得到一个array
,这样就不太好用了。 - ScrapCode
=> [2, 3, 4]```
- Nadeem我曾经尝试过这种方法
_.filter(data, function(d) { return d.name != 'a' });
可能还有更好的方法,就像用户提供的上述解决方案一样
通过使用underscore.js
var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];
var resultArr = _.reject(arr,{id:3});
console.log(resultArr);
结果将是 :: [{id:1,name:'a'},{id:2,name:'c'}]