javascript - 将 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 很陌生。
任何帮助或想法将不胜感激。
解决方案
我认为这应该做你想做的事情:迭代列表,构建所有员工的地图,然后按经理姓名将员工分类到正确的孩子组中,只返回没有经理的员工.
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));
推荐阅读
- oracle - 在 emr 集群中使用 spark 从 oracle 中获取数据并进行处理
- node.js - Nodejs:通过 express 参数检索文件是否安全?
- ios - 如何从命令行编译 iOS 项目
- c# - 使用 InteractiveDataDisplay.WPF 导出图形
- java - Java 10 中的 java.io.Reader transferTo(java.io.Writer) 方法是什么?InputStream有类似的方法吗?
- docker - 可部署 docker 容器的最大数量
- google-cloud-platform - 这个 GCP 的预测结果是什么意思?
- html - CKEditor4 以编程方式检查文本对齐方式
- javascript - 如何将这个球附加到光标上?
- python - Django Admin中用户下拉列表(外键)的排序