简体   繁体   English

将js对象转换为分层JSON结构

[英]Convert js object to hierarchic JSON structure

I have to create a JavaScript function to convert an object like the one bellow into a hierarchic JSON object. 我必须创建一个JavaScript函数,将一个波纹管这样的对象转换为分层JSON对象。

The source is an HR employee list with it's corresponding manager. 来源是人力资源员工列表及其相应的经理。

Source Object: 源对象:

Employee    Manager Title
Alfredo             general manager
Bergman     Alfredo senior engineer
Billy       Alfredo senior engineer
Johnson     Alfredo department manager
Angela      Johnson senior engineer
Anderson    Johnson senior engineer
Amy         Johnson department manager
Patsy       Amy     engineer
Jane        Amy     engineer

This is how the JSON object should look like: JSON对象应如下所示:

var datasource = {
  'name': 'Alfredo',
  'title': 'general manager',
  'children': [
    { 'name': 'Bergman', 'title': 'senior engineer' },
    { 'name': 'Johnson', 'title': 'department manager',
      'children': [
        { 'name': 'Anderson', 'title': 'senior engineer' },
        { 'name': 'Amy', 'title': 'department manager',
          'children': [
            { 'name': 'Patsy', 'title': 'engineer'},
            { 'name': 'Jane', 'title': 'engineer'}
          ]
        },
        { 'name': 'Angela', 'title': 'senior engineer' }
      ]
    },
    { 'name': 'Billy', 'title': 'senior engineer' }
  ]
};

I have tried various methods unsuccessfully, but I am quite noob on JavaScript. 我尝试了各种方法均未成功,但是我对JavaScript相当陌生。

Any help or ideas will be appreciated. 任何帮助或想法将不胜感激。

I think this should do what you want it to do: Iterate the list, building a map of all the employees, then sort the employees into the right set of children by the managers name, returning only the employee(s) that have no manager. 我认为这应该做您想要做的事情:遍历列表,构建所有员工的地图,然后按经理名称将员工按正确的子级排序,仅返回没有经理的员工。

 var entries = [{ name: 'Bergman', manager: 'Alfredo', title: 'senior engineer' }, { name: 'Billy', manager: 'Alfredo', title: 'senior engineer' }, { name: 'Johnson', manager: 'Alfredo', title: 'department manager' }, { name: 'Angela', manager: 'Johnson', title: 'senior engineer' }, { name: 'Anderson', manager: 'Johnson', title: 'senior engineer' }, { name: 'Amy', manager: 'Johnson', title: 'department manager' }, { name: 'Patsy', manager: 'Amy', title: 'engineer' }, { name: 'Jane', manager: 'Amy', title: 'engineer' }, { name: 'Alfredo', manager: '', title: 'general manager' }] function build_org_chart(list) { var map = {}, node, managers = [], i; // Build the map of employees we will use later. for (i = 0; i < list.length; i += 1) { map[list[i].name] = i; list[i].directReports = []; // init the children } for (i = 0; i < list.length; i += 1) { node = list[i]; if (node.manager != "") { // If the employee has a manager, find them var indexOfManager = map[node.manager]; // Then add that employee to the managers children. list[indexOfManager].directReports.push(node); } else { // If they haven't got a manager, must be a boss. managers.push(node); } } // Return only the top bosses. return managers; } console.log(build_org_chart(entries)); 

You could take a single loop approach by using the relation of employee to manager and vice versa. 您可以通过使用员工与经理之间的关系来采取单循环方法,反之亦然。

 var data = [{ name: 'Bergman', manager: 'Alfredo', title: 'senior engineer' }, { name: 'Billy', manager: 'Alfredo', title: 'senior engineer' }, { name: 'Johnson', manager: 'Alfredo', title: 'department manager' }, { name: 'Angela', manager: 'Johnson', title: 'senior engineer' }, { name: 'Anderson', manager: 'Johnson', title: 'senior engineer' }, { name: 'Amy', manager: 'Johnson', title: 'department manager' }, { name: 'Patsy', manager: 'Amy', title: 'engineer' }, { name: 'Jane', manager: 'Amy', title: 'engineer' }, { name: 'Alfredo', manager: '', title: 'general manager' }], tree = function (data, root) { var o = {}; data.forEach(function ({ name, manager, title }) { Object.assign(o[name] = o[name] || {}, { name, title }, o[name].children && { children: o[name].children }); o[manager] = o[manager] || { name: null, title: null }; o[manager].children = o[manager].children || []; o[manager].children.push(o[name]); }); return o[root].children; }(data, ''); console.log(tree); 
 .as-console-wrapper { max-height: 100% !important; top: 0; } 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM