Javascript 从平面对象创建嵌套对象

SBB*_*SBB 0 javascript arrays jquery json

我正在尝试创建一个层次结构,以便可以将数据传递到我用来生成组织结构图的插件。

\n\n

对于我的组织结构图,我拥有需要使用的所有数据,例如员工以及有关他们的一些基本数据。

\n\n
FirstName\nLastName\nEmployeeID\nManagerEmployeeID\nManager Name\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些数据存储在一个数组中,不同级别之间没有嵌套或链接,这就是我试图通过一些 jquery/javascript 实现的目标。

\n\n

我的目标是获取这个数组并基于它嵌套它ManagerIDEmployeeID这样我就可以创建一个树层次结构。

\n\n

我无法更改向我提供数据的方式,否则我会将其嵌套在数据库响应中。

\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.\n
Run 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    }\n
Run 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

是否有任何最佳实践来完成这样的事情?如果我有能力在数据库级别上做到这一点,我会的。但是,我只有数据列表以及基于 ID 的经理和员工之间的关联。

\n

Nen*_*car 5

您可以使用 和 创建递归函数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)