从嵌套数组中删除对象

时间:2016-03-25 21:40:40

标签: javascript arrays

我的家庭树看起来像这样:

{

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

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

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

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

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

4 个答案:

答案 0 :(得分:6)

Recursion是使用树木的好工具。

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/

答案 1 :(得分:4)

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

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

它也使用了回归。

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>');

答案 2 :(得分:1)

  

主要&#34;孩子&#34;是一个包含嵌套子数组的数组。怎么样   我可以从这样的数组中删除一个对象吗?让我们说我想   删除名称为&#34; sam&#34;的对象,这应该留给我   以下内容:

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

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

  

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

     

替换者参数

     

replacer参数可以是函数,也可以是数组。作为一个   函数,它需要两个参数,键和值   字符串化。发现密钥的对象是作为   替换者这个参数。最初用空键调用它   表示正在进行字符串化的对象,然后调用它   对象或数组上的每个属性都是字符串化的。这应该   返回应添加到JSON字符串的值,如下所示:

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

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

  •   
  • 如果您返回Boolean,&#34; true&#34;或&#34;假&#34;在将其添加到JSON时,适当地将其用作属性的值   string。

  •   
  • 如果返回任何其他对象,则会以递归方式将对象字符串化为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));

&#13;
&#13;
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;
&#13;
<pre>
</pre>
&#13;
&#13;
&#13;

答案 3 :(得分:-1)

您可以将JSON.stringify()JSON.parse()String.prototype.match()RegExp /\{"name":"sam".*(?=\]\}\]\})/一起使用,将属性"name"的属性与值{{1}相匹配删除字符串的剩余部分,直到"sam"是包含]}]}

的字符串的一部分
String.prototype.replace()

&#13;
&#13;
var res = JSON.parse(
  JSON.stringify(data)
  .replace(JSON.stringify(data).match(/\{"name":"sam".*(?=\]\}\]\})/)[0]
  , ""
  , ["children"])
);
&#13;
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);
&#13;
&#13;
&#13;