在我的应用程序中,我根据服务器的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来检索对象的路径。
答案 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