我有一个对象数组。这些对象可能有一个称为“children”的属性,该属性又包含一个对象数组。 它实际上是一棵对象树。
var my_array_of_objects=[
{
"object_info": "blah blah",
"children": [
{
"object_info": "blah blah",
"children": [
{
"object_info": "blah blah"
}
]
}
]
},
{
"object_info": "blah blah"
},
{
"object_info": "blah blah"
}
]
我正在尝试递归循环 my_array_of_objects 以返回一个数组,该数组将删除树结构并为每个对象提供一个relationship_id和一个parent_relationship_id,但是我在递归发生之前设置relationship_id时遇到问题,我可以不明白为什么......我认为这是一个范围问题?
function sort_relationships(objects, return_objects, parent_relationship_id, relationship_id){
$.each( objects, function( field_key, object ){
relationship_id++;
var new_object={};
new_object.relationship_id=relationship_id;
new_object.parent_relationship_id=parent_relationship_id;
new_object.object_info=object.object_info;
// PUSH OBJECT TO THE ARRAY TO BE RETURNED
return_objects.push(new_object);
// IF THE OBJECT HAS CHILDREN THEN RUN THE FUNCTION AGAIN WITH IT'S OBJECTS
if(object.children instanceof Array){
sort_relationships(object.children,return_objects,new_object.relationship_id,relationship_id);
}
});
return return_objects;
}
var my_new_array=sort_relationships(my_array_of_objects,[],0,0);
根据上面的代码,我希望每个新对象都有一个唯一的relationship_id,但它返回以下内容。
[
{
"relationship_id": 1,
"parent_relationship_id": 0,
"object_info": "blah blah"
},
{
"relationship_id": 2,
"parent_relationship_id": 1,
"object_info": "blah blah"
},
{
"relationship_id": 3,
"parent_relationship_id": 2,
"object_info": "blah blah"
},
{
"relationship_id": 2,
"parent_relationship_id": 0,
"object_info": "blah blah"
},
{
"relationship_id": 3,
"parent_relationship_id": 0,
"object_info": "blah blah"
}
]
我希望有以下内容:
[
{
"relationship_id": 1,
"parent_relationship_id": 0,
"object_info": "blah blah"
},
{
"relationship_id": 2,
"parent_relationship_id": 1,
"object_info": "blah blah"
},
{
"relationship_id": 3,
"parent_relationship_id": 2,
"object_info": "blah blah"
},
{
"relationship_id": 4,
"parent_relationship_id": 0,
"object_info": "blah blah"
},
{
"relationship_id": 5,
"parent_relationship_id": 0,
"object_info": "blah blah"
}
]
最佳答案
您正在对每个递归调用本地的变量执行relationship_id++
,并且不会反射(reflect)在调用者处。您要么需要返回
更新后的值,要么只使用自由变量:
function sort_relationships(objects) {
var return_objects = [];
var relationship_id = 0;
function recurse(objects, parent_relationship_id) {
$.each(objects, function(field_key, object) {
relationship_id++;
var new_object = {
relationship_id: relationship_id,
parent_relationship_id: parent_relationship_id,
object_info: object.object_info
};
// PUSH OBJECT TO THE ARRAY TO BE RETURNED
return_objects.push(new_object);
// IF THE OBJECT HAS CHILDREN THEN RUN THE FUNCTION AGAIN WITH IT'S OBJECTS
if (Array.isArray(object.children)) {
recurse(object.children, new_object.relationship_id);
}
});
}
recurse(objects, 0);
return return_objects;
}
var my_new_array=sort_relationships(my_array_of_objects);
关于javascript - 递归javascript函数返回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39191984/