2017-02-23 135 views
0
var sample = [{ 
     "_id": "1", 
     "category": "type1", 
     "path": "data1//data2//data3//data4", 
     "org": "001" 
    }, 
    { 
     "_id": "2", 
     "category": "type2", 
     "path": "data1//data2//data3//data4", 
     "org": "002" 
    } 
]; 

上面的示例数据需要转换为分层结构。转换为分层结构

var sample = { 
    children: [{ 
      name: "type1", 
      children: [{ 
       name: "data1", 
       children: [{ 
        name: "data2", 
        children: [{ 
         name: "data3", 
         children: [{ 
          name: "data4" 
         }] 
        }] 
       }] 
      }] 
     }, 
     { 
      name: "type2", 
      children: [{ 
       name: "data1", 
       children: [{ 
        name: "data2", 
        children: [{ 
         name: "data3" 
        }] 
       }] 
      }] 
     } 

    ] 
}; 

预期输出:

+type1 
    data1 
    data2 
     data3 
     data4 
+2

你尝试过什么?在我们可以帮助您之前,您需要提供无法使用的代码。如果您还没有尝试过某些方面的工作,可以对循环和创建对象进行一些研究,并在您遇到特定问题时再回来。 – scrappedcola

+0

请帮助任何人如何将平面数据转换为分层结构 – srinivas

+1

欢迎使用_StackOverflow_!在这里,你可以在学习之前正确学习[如何提问](http://stackoverflow.com/help/how-to-ask)。当提出问题时,请确保您[主题](http://stackoverflow.com/help/on-topic)并始终尝试提供[最小,完整和可验证示例](http:// stackoverflow。 com/help/mcve)。你试过什么了? – lealceldeiro

回答

0

你可以使用一个哈希表及分层结构具有通过类别或路径值进行访问的可能性分配嵌套结构的能级。

基本上这个建议检查一个键,如果不在对象中,那么将创建一个具有单个属性和一个子类数组的新对象,以及一个新对象被指向父下划线数组对前面创建的数组的数组的引用相同。

然后返回实际水平。最后,一个objetc被创建为lanst值并被推送到数组中。

var sample = [{ _id: "1", category: "type1", path: "data1//data2//data3//data4", org: "001" }, { _id: "2", category: "type2", path: "data1//data2//data3//data4", org: "002" }], 
 
    result = { children: [] }; 
 

 
sample.forEach(function (a, i) { 
 
    var keys = [a.category].concat(a.path.split('//')), 
 
     last = keys.pop(); 
 

 
    keys.reduce(function (r, k) { 
 
     if (!r[k]) { 
 
      r[k] = { _: [] }; 
 
      r._.push({ name: k, children: r[k]._ }); 
 
     } 
 
     return r[k]; 
 
    }, this)._.push({ name: last }); 
 
}, { _: result.children }); 
 

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