使用UnderscoreJS从数组中删除项目

cli*_*oid 136 javascript underscore.js

说我有这个代码

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

我想从数组中删除id = 3的项目.有没有办法在没有拼接的情况下做到这一点?Maye使用下划线或类似的东西?

谢谢!

Fel*_*ing 274

只使用普通的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);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
Run Code Online (Sandbox Code Playgroud)

虽然,既然你在这种情况下创建了一个新数组,你可以简单地使用_.filter或使用本机Array.prototype.filter函数(就像在另一个问题中所示).然后你只会迭代一次数组而不是像这里一样两次.

如果要在适当位置修改阵列,则必须使用.splice.这也在另一个问题中显示,并且非核心似乎没有为此提供任何有用的功能.

  • 不会_.reject或_.filter()在这里效率更高吗?你最终会得到列表的两次迭代,只是为了拉出一个项目. (10认同)
  • @RickStrahl你是对的.`_.reject`在这里看起来更好. (2认同)

Sus*_* -- 94

你可以使用下划线 .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
    });
Run Code Online (Sandbox Code Playgroud)

也可以写成:

var filtered = arr.filter(function(item) {
    return item.id !== 3
});

var filtered = _.filter(arr, function(item) {
    return item.id !== 3
});
Run Code Online (Sandbox Code Playgroud)

检查小提琴

你也可以使用 .reject

  • @tbh__` _()`将在集合周围创建一个包装器,让你调用下划线方法. (2认同)

gre*_*can 38

使用下划线_.reject():

arr = _.reject(arr, function(d){ return d.id === 3; });
Run Code Online (Sandbox Code Playgroud)


Pet*_*eGO 16

Underscore有一个_without()方法,非常适合从数组中删除项目,特别是如果你有要删除的对象.

返回数组的副本,其中删除了所有值的实例.

_.without(["bob", "sam", "fred"], "sam");

=> ["bob", "fred"]
Run Code Online (Sandbox Code Playgroud)

也适用于更复杂的对象.

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 }];
Run Code Online (Sandbox Code Playgroud)

如果您没有要删除的项目,只是它的属性,您可以使用_.findWhere然后_.without.

  • 注意:这只能起作用,因为你将sam对象传递给了没有.如果您将`{Name:"Sam",Age:19}`传递给没有,而不是变量sam,它就不再有效了.[小提琴](https://jsfiddle.net/mx8k13vd/) (2认同)

Saj*_*azy 6

其他答案创建数组的新副本,如果您想就地修改数组,可以使用:

arr.splice(_.findIndex(arr, { id: 3 }), 1);
Run Code Online (Sandbox Code Playgroud)

但这假设该元素将始终在数组中找到(因为如果未找到它仍将删除最后一个元素)。为安全起见,您可以使用:

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}
Run Code Online (Sandbox Code Playgroud)


Sri*_*ran 5

如果您要过滤字符串并查找不区分大小写的过滤器,请小心操作._.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"]
Run Code Online (Sandbox Code Playgroud)