javascript - 递归javascript函数返回数组

标签 javascript jquery recursion tree

我有一个对象数组。这些对象可能有一个称为“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/

相关文章:

javascript - 当响应式导航折叠开始时引发 JavaScript 事件

algorithm - 树中的最大元素

javascript - CF连接到云 Controller

javascript - 如何获取jstree中选定节点的索引

javascript - window.open 在 iPad Safari 上无法正常工作

javascript - 将来自多个 div 的代码转换为使用 Ajax

javascript - 如何使用 jQuery 提交表单然后重新加载页面

javascript - Rails Edge Guides,AJAX 示例 - 为什么同时使用 'format.js' 和 'format.json' ?

java - 找一个char优化

java - 递归快速供电方法