所以,我看过这段代码:
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
是好的。
答案 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;
}
结论:关于用例的全部内容。