簡體   English   中英

將js對象轉換為分層JSON結構

[英]Convert js object to hierarchic JSON structure

我必須創建一個JavaScript函數,將一個波紋管這樣的對象轉換為分層JSON對象。

來源是人力資源員工列表及其相應的經理。

源對象:

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相當陌生。

任何幫助或想法將不勝感激。

我認為這應該做您想要做的事情:遍歷列表,構建所有員工的地圖,然后按經理名稱將員工按正確的子級排序,僅返回沒有經理的員工。

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

您可以通過使用員工與經理之間的關系來采取單循環方法,反之亦然。

 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