使用UnderscoreJS从数组中删除项目

时间:2013-06-07 23:09:03

标签: javascript underscore.js

说我有这段代码

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

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

谢谢!

11 个答案:

答案 0 :(得分:264)

只需使用纯JavaScript,已经回答过:remove objects from array by object property

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

答案 1 :(得分: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
    });

也可以写成:

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

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

<强> Check Fiddle

您也可以使用.reject

答案 2 :(得分:38)

使用下划线_.reject()

invoice: {model:'invoices'}

答案 3 :(得分:15)

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

  

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

_.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

答案 4 :(得分:5)

如果您要过滤字符串并查找不区分大小写的过滤器,请务必小心。 _.without()区分大小写。您也可以使用_.reject(),如下所示。

- (id)initWithCoder:(NSCoder *)aDecoder
{
  self = [super initWithCoder:aDecoder];

  if (self) {
    _originalFrame = self.frame;
  }

  return self;
}

- (void)animateBackToOrigin
{
  [UIView animateWithDuration:0.1 animations:^{
      self.frame = _originalFrame;
  }];
}

答案 5 :(得分:3)

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

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

但是假设元素总是在数组中找到(因为如果没有找到它仍然会删除最后一个元素)。为了安全起见,您可以使用:

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

答案 6 :(得分:2)

或其他方便的方式:

_.omit(arr, _.findWhere(arr, {id: 3}));
我的2美分

答案 7 :(得分:2)

使用可以使用普通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#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就足够了。)

答案 8 :(得分:0)

我曾经尝试过这种方法

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

可能有更好的方法,就像用户提供的上述解决方案一样

答案 9 :(得分: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'}]

答案 10 :(得分:-1)

你可以使用Underscore的reject方法,下面会返回一个新的数组,它不会有特定匹配的数组

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