繁体   English   中英

从嵌套数组中删除对象

[英]remove object from nested array

我有一个看起来像这样的familytree:

{

    "children": [{
        "name": "bob",
        "children": [{
            "name": "sam",
            "children": [{
                "name": "mike",
                "children": [{
                    "name": "elias",
                    "children": []
                }, {
                    "name": "rodriguez",
                    "children": []
                }]
            }]
        }]
    }]
}

"children"是包含嵌套子数组的数组。 如何从这样的数组中删除对象? 假设我想删除名为“sam”的对象,这应该留给我以下内容:

{
    "children": [{
        "name": "bob",
        "children": []
    }]
}

它的巢穴让我兴奋,我不明白如何开始。

任何有关处理类似问题的教程的帮助或指示都表示赞赏。

递归是使用树木的好工具。

 var tree = { "children": [{ "name": "bob", "children": [{ "name": "sam", "children": [{ "name": "mike", "children": [{ "name": "elias", "children": [] }, { "name": "rodriguez", "children": [] }] }] }] }] } function removeFromTree(parent, childNameToRemove){ parent.children = parent.children .filter(function(child){ return child.name !== childNameToRemove}) .map(function(child){ return removeFromTree(child, childNameToRemove)}); return parent; } tree = removeFromTree(tree, 'elias') console.log(tree); document.write(JSON.stringify(tree)); 

本教程看起来很有趣(“二叉树”和“图形”部分)。 我认为它可以帮助您实现您的要求: https//www.syncano.io/blog/data-structures-in-javascript/

这是一个迭代对象并使用回溯来删除具有给定名称的所需节点的提议。

该解决方案保留原始对象并使用短路来防止必要的迭代。

它也使用了回归。

 function deleteFromTree(o, name) { function getNode(a, i) { if (a.name === name) { index = i; return true; } if (Array.isArray(a.children) && a.children.some(getNode)) { if (~index) { a.children.splice(index, 1); index = -1; } return true; } } var index = -1; [o].some(getNode); } var tree = { "children": [{ "name": "bob", "children": [{ "name": "sam", "children": [{ "name": "mike", "children": [{ "name": "elias", "children": [] }, { "name": "rodriguez", "children": [] }] }] }] }] }; deleteFromTree(tree, 'sam'); document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>'); 

主“子”是包含嵌套子数组的数组。 如何从这样的数组中删除对象? 假设我想删除名为“sam”的对象,这应该留给我以下内容:

 { "children": [{ "name": "bob", "children": [] }] } 

您可以使用JSON.stringify() replacer参数从返回的JSON字符串中删除属性

replacer可选
一种改变字符串化过程行为的函数,或一个String和Number对象数组,用作白名单,用于选择要包含在JSON字符串中的值对象的属性。 如果此值为null或未提供,则对象的所有属性都包含在生成的JSON字符串中。

replacer参数

replacer参数可以是函数或数组。 作为一个函数,它需要两个参数,键和值被字符串化。 找到密钥的对象作为replacer的this参数提供。 最初使用表示要进行字符串化的对象的空键调用它,然后为要进行字符串化的对象或数组上的每个属性调用它。 它应该返回应该添加到JSON字符串的值,如下所示:

  • 如果返回Number ,则将与该数字对应的字符串用作添加到JSON字符串时的属性值。

  • 如果返回String ,则在将该字符串添加到JSON字符串时,该字符串将用作属性的值。

  • 如果返回Boolean值,则在将其添加到JSON字符串时,将“true”或“false”用作属性的值(如果适用)。

  • 如果返回任何其他对象,则会以递归方式将对象字符串化为JSON字符串,并在每个属性上调用replacer函数,除非该对象是函数,在这种情况下,不会向JSON字符串添加任何内容。

  • 如果返回undefined,则该属性不包含在输出JSON字符串中。

    注意:您无法使用replacer函数从数组中删除值。 如果返回undefined或函数,则使用null。


var prop = "name";
var value = "sam";
var res = JSON.stringify(data, function re(a, obj) {;
     return obj[prop] === value ? null : obj
  }, 2);

console.log(res, JSON.parse(res));

 var data = { "children": [{ "name": "bob", "children": [{ "name": "sam", "children": [{ "name": "mike", "children": [{ "name": "elias", "children": [] }, { "name": "rodriguez", "children": [] }] }] }] }] }; var prop = "name"; var value = "sam"; var res = JSON.stringify(data, function re(a, obj) {; return obj[prop] === value ? null : obj }, 2); console.log(res, JSON.parse(res)); document.querySelector("pre").textContent = res; 
 <pre> </pre> 

您可以使用JSON.stringify()JSON.parse()String.prototype.match()RegExp /\\{"name":"sam".*(?=\\]\\}\\]\\})/ String.prototype.match() /\\{"name":"sam".*(?=\\]\\}\\]\\})/来具有属性"name"匹配属性,值为"sam"删除字符串的剩余部分,直到]}]}String.prototype.replace()的字符串的一部分

var res = JSON.parse(
  JSON.stringify(data)
  .replace(JSON.stringify(data).match(/\{"name":"sam".*(?=\]\}\]\})/)[0]
  , ""
  , ["children"])
);

 var data = { "children": [{ "name": "bob", "children": [{ "name": "sam", "children": [{ "name": "mike", "children": [{ "name": "elias", "children": [] }, { "name": "rodriguez", "children": [] }] }] }] }] } var res = JSON.parse( JSON.stringify(data) .replace(JSON.stringify(data).match(/\\{"name":"sam".*(?=\\]\\}\\]\\})/)[0] , "" , ["children"]) ); console.log(data) document.querySelector("pre").textContent = JSON.stringify(res, null, 2); 
 <pre> </pre> 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM