如何删除多维JavaScript对象中的子对象?

时间:2016-07-25 02:51:25

标签: javascript object recursion multidimensional-array

我得出的结论是,这几乎是不可能的。在下面的图片中,我试图用36 的键删除对象,而不知道其父级的密钥Picture of My Multidimensional JavaScript Object

我能够使用以下函数找到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]将它从实际对象中删除。

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:0)

您应该返回包含该对象的对象,而不是返回具有该id的对象,而该对象确实可用。类似的东西:

"none"

答案 2 :(得分:0)

replacer参数用于JSON.stringify

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