使用 UnderscoreJS 从数组中删除项

假设我有这个密码

var arr = [{id:1,name:'a'},{id:2,name:'b'},{id:3,name:'c'}];

我想从数组中移除 id = 3的项。有没有不用拼接的方法?也许是使用下划线之类的东西?谢谢!

186888 次浏览

可以使用下划线 .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

仅仅使用普通的 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>

Although, since you are creating a new array in this case anyway, you could simply use _.filter or the native Array.prototype.filter function (just like shown in the other question). Then you would only iterate over array once instead of potentially twice like here.

If you want to modify the array in-place, you have to use .splice. This is also shown in the other question and undescore doesn't seem to provide any useful function for that.

使用下划线 _.reject():

arr = _.reject(arr, function(d){ return d.id === 3; });

下划线有一个完美的 _ 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

你可以使用下划线的拒绝方法,下面将返回一个新的数组,它不会有特定匹配的数组

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });

如果要筛选字符串并寻找不区分大小写的筛选器,请小心。我不知道。Without ()是区分大小写的。也可以使用 _。拒绝()如下所示。

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"]

我曾经尝试过这种方法

_.filter(data, function(d) { return d.name != 'a' });

可能还有更好的方法,比如用户提供的上述解决方案

或者另一种方便的方式:

_.omit(arr, _.findWhere(arr, {id: 3}));

我的两分钱

其他答案创建数组的一个新副本,如果您想在适当的地方修改数组,可以使用:

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

注意:

  • 这两种方法都是纯函数方法(也就是说。不修改现有数组)。
  • 不,这些方法需要外部库(VanillaJavaScript 就足够了)。

通过使用 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:1name:'a'},{id:2,name:'c'}]

可以使用 loash :

_.compact(arr);