Javascript递归函数问题

时间:2017-08-14 09:13:19

标签: javascript hierarchy kendo-treeview

我正在尝试创建一个循环遍历数组层次结构并将它们连接在一起的函数。我正在努力想办法做到这一点。

我调用了一个Web API,它返回了一些具有相同属性和布局的数据,但可能会有多少Hierarchy层数组不同。

文件夹:文件夹可以包含'路由'但也可以包含其中的另一个文件夹,然后它还可以包含更多的“路由”。等

路线:作为路线的单个物体。

例如:

{
   "id":1,
   "folders":[
      {
         "id":2,
         "folders":[
            {
               "id":3,
               "folders":[],
               "routes":[]
            }
         ],
         "routes":[
            {
               "id":1002,
               "name":"Route3"
            },
            {
               "id":1003,
               "name":"Route4"
            }
         ]
      }
   ],
   "routes":[
      {
         "id":1000,
         "name":"Route1"
      },
      {
         "id":1001,
         "name":"Route2"
      }
   ]
}

我需要能够更深入地进入层次结构并使用Folders数组连接所有Routes数组,因此我可以将Kendo TreeView与一个子文件绑定,这个子文件将是Folders数组。

到目前为止,我已经尝试过:

for (var i = 0; i < Folders.length; i++) {
    if (Folder[i].Folders.length > 0) {
        for (var e = 0; e < Folder[i].Folder[e].length; e++) {
            if (Folder[i].Folders[e].length > 0) {
                ...
            }
        }
    }
}

该方法的问题在于我永远不会知道将有多少层,因此不是一种可行的方法。

我需要的结果是上面的例子:

{
   "id":1,
   "folders":[
      {
         "id":2,
         "folders":[
            {
               "id":3,
               "folders":[

               ],
               "routes":[

               ]
            },
            {
               "id":1002,
               "name":"Route3"
            },
            {
               "id":1003,
               "name":"Route4"
            }
         ]
      },
      {
         "id":1000,
         "name":"Route1"
      },
      {
         "id":1001,
         "name":"Route2"
      }
   ]
}

3 个答案:

答案 0 :(得分:1)

&#13;
&#13;
var flatRoutes = function(folders){
  for(var i in folders){

    var cur = folders[i];
    if(cur.hasOwnProperty('folders')){
      flatRoutes(cur.folders);
    }
    
    if(cur.hasOwnProperty('routes')){
      for(var i in cur.routes){
        cur.folders.push(cur.routes[i]);
      }
      
      delete cur.routes;
    }
    
  }
  
  return folders;
}
  

var json = {
   "id":1,
   "folders":[
      {
         "id":2,
         "folders":[
            {
               "id":3,
               "folders":[],
               "routes":[]
            }
         ],
         "routes":[
            {
               "id":1002,
               "name":"Route3"
            },
            {
               "id":1003,
               "name":"Route4"
            }
         ]
      }
   ],
   "routes":[
      {
         "id":1000,
         "name":"Route1"
      },
      {
         "id":1001,
         "name":"Route2"
      }
   ]
}


var routes = flatRoutes([json]);

console.log(routes);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

要从property移除object,您可以使用delete object.property

我采取了以下步骤,我认为它给出了正确的结果。

  • 创建modular函数 - formatData
  • 检查folders数组是否包含任何数据
  • 如果folders数组包含数据,请为其中的每个formatData调用folder
  • 然后,检查routes数组。如果没有路线,请返回data
  • 如果routes数组包含数据,只需将每个route推送到文件夹数组中,然后将remove属性从对象中推送出去。{/ li>

routes

答案 2 :(得分:0)

您可以使用迭代和递归方法。

&#13;
&#13;
var data = { id: 1, folders: [{ id: 2, folders: [{ id: 3, folders: [], routes: [] }], routes: [{ id: 1002, name: "Route3" }, { id: 1003, name: "Route4" }] }], routes: [{ id: 1000, name: "Route1" }, { id: 1001, name: "Route2" }] },
    result = [data].map(function iter(o) {
        return {
            id: o.id,
            folders: (o.folders && o.folders.map(iter) || []).concat(o.routes || [])
        };
    })[0];

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;