首页 > 解决方案 > 将 js 对象转换为分层 JSON 结构

问题描述

我必须创建一个 JavaScript 函数来将像下面这样的对象转换为分层 JSON 对象。

源是 HR 员工列表及其对应的经理。

源对象:

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

这是 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' }
  ]
};

我尝试了各种方法都没有成功,但我对 JavaScript 很陌生。

任何帮助或想法将不胜感激。

标签: javascript

解决方案


我认为这应该做你想做的事情:迭代列表,构建所有员工的地图,然后按经理姓名将员工分类到正确的孩子组中,只返回没有经理的员工.

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));


推荐阅读