我正在尝试创建一个循环遍历数组层次结构并将它们连接在一起的函数。我正在努力想办法做到这一点。
我调用了一个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"
}
]
}
答案 0 :(得分:1)
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;
答案 1 :(得分:0)
要从property
移除object
,您可以使用delete object.property
。
我采取了以下步骤,我认为它给出了正确的结果。
modular
函数 - formatData
folders
数组是否包含任何数据folders
数组包含数据,请为其中的每个formatData
调用folder
routes
数组。如果没有路线,请返回data
routes
数组包含数据,只需将每个route
推送到文件夹数组中,然后将remove
属性从对象中推送出去。{/ li>
routes
答案 2 :(得分:0)
您可以使用迭代和递归方法。
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;