【问题标题】:How to remove a child object in a multidimensional JavaScript object?如何删除多维 JavaScript 对象中的子对象?
【发布时间】:2016-11-28 06:44:21
【问题描述】:

我得出的结论是,这几乎是不可能的。在下图中,我试图在不知道其父项的键的情况下删除具有 36 个键的对象。

我能够使用以下函数找到键为 36 的对象(其中 o 是对象,id 是键),但是,我无法看到从对象。

function findById(o, id) {
    //Early return
    if( o.id === id ){
      return o;
    }
    var result, p; 
    for (p in o) {
        if( o.hasOwnProperty(p) && typeof o[p] === 'object' ) {
            result = findById(o[p], id);
            if(result){
                return result;
            }
        }
    }
    return result;
}

在寻找其他解决方案之前,我想我不妨问问 SO 编程社区的专家。

[更新] 解决方案实际上非常简单(请参见下面的答案)。我没有意识到递归的第一级中的 o[p] 是对实际对象的引用,这意味着 delete o[p] 将其从实际对象中删除。

【问题讨论】:

    标签: javascript object recursion multidimensional-array


    【解决方案1】:

    如果你能找到它,你就能找到它的父级。如果您可以找到其父项,则可以删除您要查找的密钥。你可以修改你的函数来做到这一点。成功时将返回true

    function deleteId(o, id) {
        if(o.hasOwnProperty(id)) {
            return delete o[id];
        }
        var p;
        for(p in o) {
            if(o.hasOwnProperty(p) && typeof o[p] === 'object') {
                var success = deleteId(o[p], id);
                if(success) {
                    return true;
                }
            }
        }
        return false;
    }
    

    【讨论】:

      【解决方案2】:

      您应该返回包含该对象的对象,而不是返回具有该 ID 的对象,该对象确实可用。比如:

      function findParentOfId(o, id) {
        //Early return
        if ( o.id === id ){
          return true;
        }
        var result, p; 
        for (p in o) {
          if( o.hasOwnProperty(p) && typeof o[p] === 'object' ) {
            result = findParentOfId(o[p], id);
            if (result === true){
              return o;
            } else if (typeof result === 'object') {
              return result;    
            }
          }
        }
        return result;
      }
      
      function deleteKey(key) {
        parentObject = findParentOfId(key);
        delete parentObject[key];
      }
      

      【讨论】:

        【解决方案3】:

        JSON.stringify使用replacer参数:

        JSON.parse(JSON.stringify(input, function(key, value) {
          return key === '36' ? undefined : value;
        }));
        

        【讨论】:

          猜你喜欢
          • 2021-04-11
          • 2021-04-12
          • 2020-05-18
          • 1970-01-01
          • 2021-01-26
          • 1970-01-01
          • 1970-01-01
          • 2011-10-02
          • 2019-11-25
          相关资源
          最近更新 更多