2017-02-10 59 views
1

当前正在使用lodash进行具有扁平数据结构的树。但手动传递属性来生成组。我想树生成函数有两个参数通过lodash进行动态分组

function makeTree(data,properties){} 

当前数据结构分离

var data = [ 
 
    {"taskID": 1,"taskTitle": "Project Meeting","tagID": 23,"tagName": "IT Project V4","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 1,"taskTitle": "Project Meeting","tagID": 5,"tagName": "Customer 1","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 1,"taskTitle": "Project Meeting","tagID": 19,"tagName": "Project 3","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 1,"taskTitle": "Project Meeting","tagID": 14,"tagName": "Internal Dev","tagTypeID": 3,"tagType": "Development"}, 
 
    {"taskID": 1,"taskTitle": "Project Meeting","tagID": 4,"tagName": "Customer 2","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 2,"taskTitle": "Weekly Team Meeting","tagID": 10,"tagName": "IT Project","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 2,"taskTitle": "Weekly Team Meeting","tagID": 11,"tagName": "Project 2","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 2,"taskTitle": "Weekly Team Meeting","tagID": 14,"tagName": "Internal Dev","tagTypeID": 3,"tagType": "Development"}, 
 
    {"taskID": 2,"taskTitle": "Weekly Team Meeting","tagID": 23,"tagName": "IT Project V4","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 10,"tagName": "IT Project","tagTypeID": 2,"tagType": "Project"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 7,"tagName": "Inpex","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 2,"tagName": "Agrium","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 3,"tagName": "Sain Gobain","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 4,"tagName": "Customer 2","tagTypeID": 1,"tagType": "Customer"}, 
 
    {"taskID": 3,"taskTitle": "Release Planing","tagID": 5,"tagName": "Customer 1","tagTypeID": 1,"tagType": "Customer"} 
 

 
]; 
 

 

 

 
var output= _(data).groupBy('tagType').map(function (value, key) { 
 
      return { 
 
       value: key, 
 
       children : _(value).groupBy('tagName').map(function(val,key){ 
 
\t \t \t \t return { value : key, children : _(val).groupBy('taskTitle').map(function(v,k){ return { value : v,children:[]}}).value() } 
 
\t \t \t }).value() 
 
      } 
 
     }).value(); 
 

 
console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

回答

1

试试这个递归解决方案。 好处是,它将与任何数量的属性组合使用。

let makeTree = function (data, properties) { 
 
\t let curPropName = properties[0]; 
 
\t let remainingProps = _.drop(properties, 1); 
 

 
\t return _(data) 
 
\t \t .groupBy(curPropName) 
 
\t \t .map(function (val, key) { 
 
\t \t \t if (properties.length > 1) { 
 
\t \t \t \t return { 
 
\t \t \t \t \t value: key, 
 
\t \t \t \t \t children: makeTree(val, remainingProps) 
 
\t \t \t \t }; 
 
\t \t \t } else { 
 
\t \t \t \t return {value: val, children: []}; 
 
\t \t \t } 
 
\t \t }) 
 
\t \t .value(); 
 
}; 
 

 
//To get the same result as you get now call it like this 
 
let tree = makeTree(data, ['tagType', 'tagName', 'taskTitle']);