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

Check if object exists in an array before pushing

本文关键字:于数组 数组 存在 是否 对象 检查      更新时间:2023-09-26

我有一个空数组和一个可选择的树,每次当用户选中或取消选中一个节点时,我都会推送节点的id,以及复选框是真还是假。

但是现在如果用户选中一个节点然后取消选中那么在同一个节点的数组中将有两个对象我如何确保不会发生这种情况呢?

//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});
},

在推入新对象之前,可以检查是否存在具有该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
}

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

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

你有一个很好的Id,因为它可以用于惟一性。也许数组并不是最适合你的。有更好的方法来处理它,只是简单的对象(见Mike McCaughan的回答)和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()

Map就像键/值存储,很像对象