[英]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.