Javascript 在knockout.js可观察数组中防止重复项

Javascript 在knockout.js可观察数组中防止重复项,javascript,knockout.js,Javascript,Knockout.js,我运行一个定时循环,从服务器异步获取数据并更新一个可观察的数组。我原以为这样可以防止DUP,但似乎没有。如何防止添加重复项 // Operations self.addDevice = function (device) { if (device != null && ko.utils.arrayIndexOf(self.devices, device) < 0) { self.devices.push(device); } } //操作

我运行一个定时循环,从服务器异步获取数据并更新一个可观察的数组。我原以为这样可以防止DUP,但似乎没有。如何防止添加重复项

// Operations
self.addDevice = function (device) {
    if (device != null && ko.utils.arrayIndexOf(self.devices, device) < 0) {
        self.devices.push(device);
    } 
}
//操作
self.addDevice=功能(设备){
if(device!=null&&ko.utils.arrayIndexOf(self.devices,device)<0){
自。装置。推(装置);
} 
}

这总是返回true,因为数组中不包含特定设备(尽管它显然包含)。

您得到的更新可能与数组中的对象具有相同的值,但它们可能是不同的对象,因此简单的相等性检查将返回false。您必须提供一个回调来通过比较对象中的属性来测试自己是否相等

例如,如果
a={prop:5}
b={prop:5}
,则
a==b
返回false。您需要将函数传递给
ko.utils.arrayFirst
ko.utils.arrayFilter

var newItem = new Item();

ko.utils.arrayFirst(self.items(), function(existingItem, newItem) {
    return existingItem.prop == newItem.prop;
}

使用
ko.utils.arrayFirst
并传递一个函数,以按值比较项目
。看见