使用indexOf从列表中删除对象?

时间:2015-02-25 08:54:33

标签: javascript coffeescript indexof

所以,我看过这段代码:

removeOrder = (order) ->
    index = listOfOrders.indexOf(order)
    if index isnt -1
        listOfOrders.splice index, 1

其中order是这样的对象:

order = {
    id: whatever
    field1: whatever
    ...
}

现在这样做是因为作为参数传递的order引用listOfOrders中的某个对象,类似于removeOrder(listOfOrders[i])。但我的问题是,这样安全吗?我的意思是,我认为最好迭代订单列表并搜索具有相同id的对象,例如,并将其删除。

据我所知,当我们搜索的对象是一个“简单”对象(数字,字符串等)时,indexOf是好的。

3 个答案:

答案 0 :(得分:1)

根据These docs for indexOf,indexOf使用严格相等===

var a = {id:1};
var b = {id:1};

a === a; // this is true
a === b; // this is false

因此一般来说对象是安全的

你需要在拼接之前检查indexOf!= -1

答案 1 :(得分:0)

该函数的作用是假定对数组中的对象只有一个引用。

如果对象不在数组中(或者您正在使用数组中对象的克隆来调用它),则索引将为-1,splice调用将删除最后一项数组代替。因为这不是一个合理的行为,所以应该检查一下(我看到你加了)。

indexOf方法对于对象引用可靠地工作,但它自然必须寻找相同的对象。

寻找具有特定属性值的对象也会起作用,但它也采用相同的假设;该值必须在数组中恰好发生一次才能按预期工作。

答案 2 :(得分:0)

var removeOrder = function(order)
{
  var index = listOfOrders.indexOf(order);
  if (index != -1)
    return listOfOrders.splice(index, 1); //for chaining?
  return listOfOrders;
}

如果预期的目的是通过它的引用从数组中删除对象,那么使用indexOf是安全的。

如果您想要id删除第一个对象,请说明,您可以使用以下内容:

var removeOrderById = function(orderId)
{
  var orders = listOfOrders.filter(function(item) 
  {
    return item.id == orderId;
  });
  if (orders.length > 0)
  {
    var index = listOfOrders.indexOf(orders[0]);
    return listOfOrders.splice(index, 1); //for chaining?
  }
  return listOfOrders;
}

结论:关于用例的全部内容。