SBB*_*SBB 0 javascript arrays jquery json
我正在尝试创建一个层次结构,以便可以将数据传递到我用来生成组织结构图的插件。
\n\n对于我的组织结构图,我拥有需要使用的所有数据,例如员工以及有关他们的一些基本数据。
\n\nFirstName\nLastName\nEmployeeID\nManagerEmployeeID\nManager Name\nRun Code Online (Sandbox Code Playgroud)\n\n这些数据存储在一个数组中,不同级别之间没有嵌套或链接,这就是我试图通过一些 jquery/javascript 实现的目标。
\n\n我的目标是获取这个数组并基于它嵌套它ManagerID,EmployeeID这样我就可以创建一个树层次结构。
我无法更改向我提供数据的方式,否则我会将其嵌套在数据库响应中。
\n\n示例数据:
\n\n\xe2\x80\xa2 Tom Jones\n o Alice Wong\n o Tommy J.\n\xe2\x80\xa2 Billy Bob\n o Rik A.\n \xe2\x99\xa3 Bob Small\n \xe2\x99\xa3 Small Jones\n o Eric C.\nRun Code Online (Sandbox Code Playgroud)\n\n我的平面数据示例:
\n\n {\n "FirstName": "Tom"\n "LastName": "Jones"\n "EmployeeID": "123"\n "ManagerEmployeeID": ""\n "Manager Name": ""\n },\n {\n "FirstName": "Alice"\n "LastName": "Wong"\n "EmployeeID": "456"\n "ManagerEmployeeID": "123"\n "Manager Name": "Tom Jones"\n },\n {\n "FirstName": "Tommy"\n "LastName": "J."\n "EmployeeID": "654"\n "ManagerEmployeeID": "123"\n "Manager Name": "Tom Jones"\n },\n {\n "FirstName": "Billy"\n "LastName": "Bob"\n "EmployeeID": "777"\n "ManagerEmployeeID": ""\n "Manager Name": ""\n },\n {\n "FirstName": "Rik"\n "LastName": "A."\n "EmployeeID": "622"\n "ManagerEmployeeID": "777"\n "Manager Name": "Billy Bob"\n },\n {\n "FirstName": "Bob"\n "LastName": "Small"\n "EmployeeID": "111"\n "ManagerEmployeeID": "622"\n "Manager Name": "Rik A."\n },\n {\n "FirstName": "Small"\n "LastName": "Jones"\n "EmployeeID": "098"\n "ManagerEmployeeID": "622"\n "Manager Name": "Rik A"\n },\n {\n "FirstName": "Eric"\n "LastName": "C."\n "EmployeeID": "222"\n "ManagerEmployeeID": "777"\n "Manager Name": "Billy Bob"\n }\nRun Code Online (Sandbox Code Playgroud)\n\n所需输出示例:
\n\n{\n "FirstName": "Tom",\n "LastName": "Jones",\n "EmployeeID": "123",\n "ManagerEmployeeID": "",\n "Manager Name": "",\n {\n "FirstName": "Alice",\n "LastName": "Wong",\n "EmployeeID": "456",\n "ManagerEmployeeID": "123",\n "Manager Name": "Tom Jones",\n\n },\n {\n "FirstName": "Tommy",\n "LastName": "J.",\n "EmployeeID": "654",\n "ManagerEmployeeID": "123",\n "Manager Name": "Tom Jones",\n\n },\n\n},\n{\n "FirstName": "Billy",\n "LastName": "Bob",\n "EmployeeID": "777",\n "ManagerEmployeeID": "",\n "Manager Name": "",\n {\n "FirstName": "Rik",\n "LastName": "A.",\n "EmployeeID": "622",\n "ManagerEmployeeID": "777",\n "Manager Name": "Billy Bob",\n ,\n {\n "FirstName": "Bob",\n "LastName": "Small",\n "EmployeeID": "111",\n "ManagerEmployeeID": "622",\n "Manager Name": "Rik A.",\n\n },\n {\n "FirstName": "Small",\n "LastName": "Jones",\n "EmployeeID": "098",\n "ManagerEmployeeID": "622",\n "Manager Name": "Rik A",\n\n },\n\n },\n\n},\n{\n "FirstName": "Eric",\n "LastName": "C.",\n "EmployeeID": "222",\n "ManagerEmployeeID": "777",\n "Manager Name": "Billy Bob",\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n是否有任何最佳实践来完成这样的事情?如果我有能力在数据库级别上做到这一点,我会的。但是,我只有数据列表以及基于 ID 的经理和员工之间的关联。
\n您可以使用 和 创建递归函数reduce(),它将返回所需的数据结构。
var data = [{"FirstName":"Tom","LastName":"Jones","EmployeeID":"123","ManagerEmployeeID":"","Manager Name":""},{"FirstName":"Alice","LastName":"Wong","EmployeeID":"456","ManagerEmployeeID":"123","Manager Name":"Tom Jones"},{"FirstName":"Tommy","LastName":"J.","EmployeeID":"654","ManagerEmployeeID":"123","Manager Name":"Tom Jones"},{"FirstName":"Billy","LastName":"Bob","EmployeeID":"777","ManagerEmployeeID":"","Manager Name":""},{"FirstName":"Rik","LastName":"A.","EmployeeID":"622","ManagerEmployeeID":"777","Manager Name":"Billy Bob"},{"FirstName":"Bob","LastName":"Small","EmployeeID":"111","ManagerEmployeeID":"622","Manager Name":"Rik A."},{"FirstName":"Small","LastName":"Jones","EmployeeID":"098","ManagerEmployeeID":"622","Manager Name":"Rik A"},{"FirstName":"Eric","LastName":"C.","EmployeeID":"222","ManagerEmployeeID":"777","Manager Name":"Billy Bob"}];
function makeTree(data, parentId) {
return data.reduce(function(r, e) {
if (e.ManagerEmployeeID == parentId) {
var employees = makeTree(data, e.EmployeeID);
if (employees.length) e.employees = employees
r.push(e)
}
return r;
}, [])
}
console.log(makeTree(data, ''))Run Code Online (Sandbox Code Playgroud)