在推送之前检查数组中是否存在对象

时间:2016-07-05 20:58:18

标签: javascript mvvm

我有一个空数组和一个可选择的树,每当用户检查或取消检查节点时,我正在推送节点的id,如果该复选框为true或false。

但是现在如果用户检查然后取消检查节点,那么同一节点的数组中将有两个对象,我怎样才能确保不会发生?

//creating empty array

var checkedItems = []; 

//(in kendo observable) on user selection I'm pushing the checked node to array

onItemChecked : function (e) {
    var node = e.sender.dataItem(e.node);
    checkedItems.push({Id: node.Id, IsChecked: node.checked});
},

3 个答案:

答案 0 :(得分:4)

在推送新对象之前,您可以检查是否存在具有该ID的对象。

var el = checkedItems.filter(function(el) {
    return el.Id === node.Id;
});

if (el.length) {
    el[0].IsChecked = node.checked;
} else {
   // push a new object
}

答案 1 :(得分:1)

您可以使用一个保证具有唯一键的对象:

var checkedItems = {};
onItemChecked : function (e) {
    var node = e.sender.dataItem(e.node);
    checkedItems[node.Id] = node.checked;
},

答案 2 :(得分:1)

你有一个id,它可以用于唯一性。因此,阵列可能不是最适合您想要完成的任务。有更好的方法来处理它只是普通的对象(见Mike McCaughan answer)和Map

var items = new Map
items.set(node.Id, node.checked)

// Removing items is as easy as 
items.remove(node.Id)

// Getting
var checked = items.get(node.Id)

// Then if you want to iterate over them you would do something like:
for (var [key, value] of items.entries()) {
    console.log(key + " = " + value)
}

var values = items.values()
var keys = items.keys()

地图就像一个键/值存储,就像对象

一样