【问题标题】:Check if object exists in an array before pushing在推送之前检查对象是否存在于数组中
【发布时间】:2016-07-05 20:58:18
【问题描述】:

我有一个空数组和一个可选树,每次当用户检查或取消检查节点时,我都会推送节点的 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});
},

【问题讨论】:

    标签: javascript mvvm


    【解决方案1】:

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

    【讨论】:

    • @ManoDestra 感谢您更新我懒惰写的答案。
    • 谢谢你,一切顺利。
    【解决方案2】:

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

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

    【讨论】:

    • 注意在此处创建新对象,因为{} && {} 可以两次添加到集合中
    • 我正在使用 Vohuman 的解决方案,我确实需要对旧浏览器的支持,不过谢谢!
    • @Endless;我无法完全解析你在这里说的话。它与对象引用的相等性有关吗?你可能是对的......我会拿出赛特。
    • 这就是我的意思,参考
    【解决方案3】:

    你有一个 ID,它是 grate,因为它可以用于唯一性。所以也许一个数组不是最适合你想要完成的事情。有更好的方法来处理它只用普通对象(见 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()
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-23
      • 1970-01-01
      • 2020-11-30
      • 2013-12-04
      相关资源
      最近更新 更多