使用indexOf从列表中删除对象

Using indexOf to remove an Object from a list?

本文关键字:删除 对象 列表 indexOf 使用      更新时间:2024-05-29

所以,我看到了这段代码:

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是可以的

根据indexOf的这些文档,indexOf使用严格相等的===

var a = {id:1};
var b = {id:1};
a === a; // this is true
a === b; // this is false

所以它是安全的,一般来说,对象

您确实需要检查indexOf!=-1通过拼接前

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

结论:这都是关于用例的。

假设数组中正好有一个对对象的引用,则函数的工作方式为整数。

如果对象不在数组中(或者使用数组中对象的克隆调用它),则索引将为-1,而splice调用将删除数组中的最后一项。由于这不是一种合理的行为,因此确实应该对此进行检查(我看到你补充了这一点)。

indexOf方法可靠地适用于对象引用,但它实际上必须查找相同的对象。

寻找一个具有特定属性值的对象也是可行的,但它遵循相同的假设;该值必须在数组中恰好出现一次才能按预期工作。