如何使用父ID将对象添加到嵌套的javascript对象

时间:2012-10-15 16:08:38

标签: javascript json rest

在我的应用程序中,我根据服务器的JSON响应创建一个JavaScript对象,类似于:

{
  name: "root",
  id: 1,
  children: [
    {
      name: "child one",
      id: 11,
      children: [
       {name: "grand child 1", id: 111, children: []},
       {name: "grand child 2", id: 112, children: []}
      ]
   },
   {
     name: "child two",
     id: 12,
     children: []
   }
  ]
}

我创建了一个新节点,例如:

 {name: "grandchild three", id: 113, children:[]}

考虑到这一点,我如何将这个新孙子添加到ID为11的父母?请注意,我不知道id == 11节点的静态路径,所以我想知道如何通过知道id来获取该节点。

编辑:请注意真实案例中的ID不会对对象的路径进行编码。我创建了这个简单的例子来演示我正在处理的数据结构。但我无法在我的实际应用程序中使用其ID来检索对象的路径。

5 个答案:

答案 0 :(得分:6)

看到这个小提琴:http://jsfiddle.net/2Dvws/

它将通过ID找到一个对象。并推动新的孩子。由于Javascript中的每个对象都是引用,因此可以将其作为var。

返回
var ob = {
    name: "root",
    id: 1,
    children: [
        {
        name: "child one",
        id: 11,
        children: [
            {
            name: "grand child 1",
            id: 111,
            children: []},
        {
            name: "grand child 2",
            id: 112,
            children: []}
        ]},
    {
        name: "child two",
        id: 12,
        children: []}
    ]
};

将返回找到的元素的函数。将调查所有子元素。

function findObjectById(root, id) {
    if (root.children) {
        for (var k in root.children) {
            if (root.children[k].id == id) {
                return root.children[k];
            }
            else if (root.children.length) {
                return findObjectById(root.children[k], id);
            }
        }
    }
};

var bla = findObjectById(ob, 111);

console.log(bla);
bla.children.push({
        name: "child x",
        id: 1111,
        children: []
});
console.log(ob);

输出是id为111的孩子将有1个id为1111的孩子     

答案 1 :(得分:2)

我假设id由children-id加上children数组中的索引(1到9)组成?然后你就可以这样:

var rootobj = {…};
var newnode = {name: "grandchild three", id: 113, children:[]};

var id = ""+newnode.id;
var cur = [rootobj];
for (var i=0; i<id.length-i; i++)
    cur = cur[id.charAt(i)-1].children;
cur[id.charAt(i)-1] = newnode;

答案 2 :(得分:1)

Niels的答案是一个良好的开端,但没有完全遍历树(例如,如果您要查找的节点是根的第二个子节点的子节点,它将会中断)。如果root是你正在寻找的id,它也会中断。以下是我的改进:

setInterval()

答案 3 :(得分:0)

这个怎么样。

for(var a = 0; a < object.length; a++) {
    for(var b = 0; b < obj.children.length; b++) {
        if(object[a].children[b].id == 11) {
           object[a].children[b].children.push({
                name: "grandchild three", 
                id: 113, 
                children: []
            });
        }
    }
}

答案 4 :(得分:0)

我建议您不要重新发明轮子。现在,我们大部分的数据处理都喜欢object-scan。一旦将头缠住它,它就会很强大。这是您如何回答问题的方法

SELECT column_name FROM myDataset.myTable