将项目推入 JavaScript 中的 multi-dimensional 树状结构
Pushing item into a multi-dimensional tree like structure in JavaScript
我有一个 object 的数组,它是这样的
var obj = [{
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2,
children: [..]
},{
id: 25,
name: 'Test2,
children: [..]
}],
},{..}]
每个 children 可以有多个子 children,所以基本上我试图表示一个图形结构,类似于 htmlparser 的输出。
我需要这样的功能:
function(nodeId, json){}
该函数需要使用 nodeId 在树中找到 json object 并将 json 作为 [=37= 的 children 插入] object。那就是我被困的地方。
我尝试编写这样的递归函数来搜索适当的节点,但是,当我必须将 json 插入实际的 obj 数组时,问题就来了。
function findNode(nodeId, json, obj){
if(obj.id == nodeId){
obj.children.push(json);
}
else{
for(var i=0; i<obj.children.length; i++){
findNode(nodeId, json, obj.children[i]);
}
}
}
似乎 json 被插入到递归函数的局部对象,而不是实际的根对象。我怎样才能将它插入到 parent obj?
你必须return对象
检查这个:
var obj = [{
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2',
children: []
},{
id: 25,
name: 'Test2',
children: []
}],
}];
var findNode = function(nodeId, json, o){
if(o.id == nodeId){
o.children.push(json);
}
else{
if(o.children){
for(var i=0; i<o.children.length; i++){
o.children[i] = findNode(nodeId, json, o.children[i]);
}
}
}
return o;
};
obj = findNode(24,{
id: 26,
name: 'Test2',
children: []
}, obj);
console.log (obj);
首先,查看你的对象结构,你的根对象的结构看起来是错误的。根对象不能是您想要的对象的数组。要利用递归,您应该具有在所有级别上都相似的结构。
你的函数实现几乎是正确的。
我只是希望你没有将 JSON 字符串作为 json
参数传递;如果是,则必须解析它并使用 JSON.parse(json)
创建一个 JS 对象
这是更新后的实现:
var obj = {
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2',
children: []
},{
id: 25,
name: 'Test2',
children: []
}],
};
var objToBePushed = {
id: 26,
name: 'Test3',
children: [{
id: 27,
name: 'Test4',
children: []
}]
};
function findNode(nodeId, json, node){
if(node.id == nodeId){
node.children.push(json);
}
else{
for(var i=0; i<node.children.length; i++){
findNode(nodeId, json, node.children[i]);
}
}
}
findNode(24, objToBePushed, obj);
console.log(obj);
工作 JSFiddle:http://jsfiddle.net/ef3ewoag/2/
我有一个 object 的数组,它是这样的
var obj = [{
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2,
children: [..]
},{
id: 25,
name: 'Test2,
children: [..]
}],
},{..}]
每个 children 可以有多个子 children,所以基本上我试图表示一个图形结构,类似于 htmlparser 的输出。
我需要这样的功能:
function(nodeId, json){}
该函数需要使用 nodeId 在树中找到 json object 并将 json 作为 [=37= 的 children 插入] object。那就是我被困的地方。
我尝试编写这样的递归函数来搜索适当的节点,但是,当我必须将 json 插入实际的 obj 数组时,问题就来了。
function findNode(nodeId, json, obj){
if(obj.id == nodeId){
obj.children.push(json);
}
else{
for(var i=0; i<obj.children.length; i++){
findNode(nodeId, json, obj.children[i]);
}
}
}
似乎 json 被插入到递归函数的局部对象,而不是实际的根对象。我怎样才能将它插入到 parent obj?
你必须return对象
检查这个:
var obj = [{
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2',
children: []
},{
id: 25,
name: 'Test2',
children: []
}],
}];
var findNode = function(nodeId, json, o){
if(o.id == nodeId){
o.children.push(json);
}
else{
if(o.children){
for(var i=0; i<o.children.length; i++){
o.children[i] = findNode(nodeId, json, o.children[i]);
}
}
}
return o;
};
obj = findNode(24,{
id: 26,
name: 'Test2',
children: []
}, obj);
console.log (obj);
首先,查看你的对象结构,你的根对象的结构看起来是错误的。根对象不能是您想要的对象的数组。要利用递归,您应该具有在所有级别上都相似的结构。
你的函数实现几乎是正确的。
我只是希望你没有将 JSON 字符串作为 json
参数传递;如果是,则必须解析它并使用 JSON.parse(json)
这是更新后的实现:
var obj = {
id: 23,
name: 'Test1',
children: [{
id: 24,
name: 'Test2',
children: []
},{
id: 25,
name: 'Test2',
children: []
}],
};
var objToBePushed = {
id: 26,
name: 'Test3',
children: [{
id: 27,
name: 'Test4',
children: []
}]
};
function findNode(nodeId, json, node){
if(node.id == nodeId){
node.children.push(json);
}
else{
for(var i=0; i<node.children.length; i++){
findNode(nodeId, json, node.children[i]);
}
}
}
findNode(24, objToBePushed, obj);
console.log(obj);
工作 JSFiddle:http://jsfiddle.net/ef3ewoag/2/