【问题标题】:How to delete something in a JavaScript object that can be nested arbitrarily deep?如何删除可以任意嵌套深度的 JavaScript 对象中的某些内容?
【发布时间】:2017-05-30 20:34:22
【问题描述】:

我有一个 JavaScript 对象来管理我的应用程序的所有数据。它看起来像这样:

parent = {
    data: 'abcdef',
    children: {
        'child1' : {
             data: 'ghijkl',
             children: {...}
         },
         'child2' : {
             data: 'mnopqr',
             children: {...}
         }
    }
}

为了管理哪个是当前活动的节点,我保留了一个名为“地址”的数组,它是一个列表,其中列出了要遍历整个结构并到达所需点的名称。例如,[] 作为地址给出了整个结构,['child1'] 作为地址给出了主对象的'child1'。

我的问题是,给定一个地址,我需要能够删除该特定节点,该节点可以在整个结构中任意深入,我该怎么做?例如 remove(['child1']) 应该从示例结构中删除 'child1',而 'child2' 保持不变。所有删除操作都应返回删除单个节点的整个结构。

【问题讨论】:

  • 可能像这样delete parent.children['child1'];
  • 也许适合儿童的数组更适合...
  • @LGSon 问题在于它们嵌套的深度任意。我可能需要删除 child1 的孩子的孩子的孩子。该方法仅在深度为 1 时有效。我的示例没有很好地解释这一点。
  • (1) 为什么你的地址是一个数组而不仅仅是一个字符串(根可能为空,目标对象的属性名可能为空)? (2) 你所有的嵌套属性名称都是唯一的,否则你怎么知道哪个是目标? (3) 如果数组应该给出目标的path,那么为什么在你的例子中你有['child1']而不是['children', 'child1']
  • 所以当你说任意深度时,你的地址会不会像[childN,childN2,childN3]

标签: javascript arrays object javascript-objects


【解决方案1】:

这样就可以了。

remove = function(address, tree) {
    if (address.length === 1) { 
        delete tree.children[address[0]]; 
    } else {
        remove(address.slice(1), tree.children[address[0]]);
    }
}

传入parent作为开始的树参数。

【讨论】:

  • 这假设您的地址数组从上到下从左到右。
【解决方案2】:

如果这不是您想要的,请原谅,我“认为”我知道您想要什么。但递归可能是你最好的选择。我刚刚整理了一下,但也许其他人有更简洁的解决方案。

假设,在下面的示例中,您要删除嵌套的“child1a”。我们应该能够做到这一点。

parent = {
    data: 'abcdef',
    children: {
        'child1' : {
             data: 'ghijkl',
             children: {
                'child1a' : {
                     data: 'data for child1a',
                     children: {}
                 }
             }
         },
         'child2' : {
             data: 'mnopqr',
             children: {}
         }
    }
};

function deleteNode(node, child) {
    if(node[child]) {
      delete node[child];
      return;
    }
    var children = Object.keys(node);
    for(var i = 0; i < children.length; i++) {    
      return deleteNode(node[children[i]].children, child);
    }
}
deleteNode(parent.children, 'child1a')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 2017-06-01
    • 2021-04-19
    • 2021-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多