143

说我有这个代码

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

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

谢谢!

4

11 回答 11

284

只需使用纯 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. 这也显示在另一个问题中,并且 undescore 似乎没有为此提供任何有用的功能。

于 2013-06-07T23:18:56.890 回答
96

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

于 2013-06-07T23:17:25.887 回答
39

使用下划线_.reject()

arr = _.reject(arr, function(d){ return d.id === 3; });
于 2015-07-27T10:24:29.687 回答
18

Underscore有一个_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 }];

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

于 2015-09-18T22:15:18.090 回答
6

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

arr.splice(_.findIndex(arr, { id: 3 }), 1);

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

var index = _.findIndex(arr, { id: 3 });
if (index > -1) {
    arr.splice(index, 1);
}
于 2017-01-17T07:06:02.780 回答
6

如果您正在过滤字符串并寻找不区分大小写的过滤器,请小心。_.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"]
于 2015-10-07T08:03:17.097 回答
2

使用可以像这样使用纯 JavaScriptArray#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#reduceArray#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);

笔记:

  • 这两种都是纯函数方法(它们不修改现有数组)。
  • 不,这些方法需要外部库(Vanilla JavaScript 就足够了)。
于 2018-07-19T05:47:09.647 回答
2

或另一种方便的方式:

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

我的 2 美分

于 2016-03-24T20:00:03.667 回答
0

我曾经尝试过这种方法

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

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

于 2016-03-01T06:45:28.160 回答
0

通过使用 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'}]

于 2018-12-27T11:40:17.853 回答
-1

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

arr = _.reject(arr, function(objArr){ return objArr.id == 3; });
于 2015-09-24T04:44:15.533 回答