[英]deep hierarchy data tree
嗨,我幾周以來一直面臨一個問題並且無法解決,我有一個對象數組,其中我幾乎沒有像fullName
和reportingTo
這樣的屬性,然后我有另一個對象是 CEO,最終的數據結構是每個對象現在有一個fullName
如果在任何其他對象中,如果reportingTo
與其名稱匹配,則必須從數組中刪除該對象並添加到 children 屬性中,我只能在幾個級別上做到這一點,但我需要它是動態的,所以即使必須有 100 個父母,我將數據放在下面,以及到目前為止我能做的事情
let data = [
{
department: "development",
designation: "lead",
employeeId: "2",
fullName: "Kashif",
reportingTo: "Rashid",
workEmail: "lead@gmail.com",
workPhone: "2222222222",
},
{
department: "development",
designation: "UI Developer",
employeeId: "3",
fullName: "Sharif",
reportingTo: "Rashid",
workEmail: "ui@gmail.com",
workPhone: "3333333333",
},
{
department: "development",
designation: "UX Developer",
employeeId: "4",
fullName: "Naveen",
reportingTo: "Rashid",
workEmail: "ux@gmail.com",
workPhone: "4444444444",
},
{
department: "development",
designation: "Developer",
employeeId: "5",
fullName: "Mani",
reportingTo: "Kiran",
workEmail: "developer@gmail.com",
workPhone: "5555555555",
},
{
department: "development",
designation: "Developer",
employeeId: "6",
fullName: "Joseph",
reportingTo: "kiran",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "7",
fullName: "Waseem",
reportingTo: "Mani",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "8",
fullName: "Munir",
reportingTo: "Waseem",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "9",
fullName: "Maaz",
reportingTo: "Munir",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "10",
fullName: "Hazma",
reportingTo: "Maaz",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "11",
fullName: "Muhammad",
reportingTo: "Maaz",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "11",
fullName: "Kiran",
reportingTo: "Rashid",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
];
let ceo = {
department: "management",
designation: "ceo",
employeeId: "1",
fullName: "Rashid",
reportingTo: "null",
workEmail: "ceo@gmail.com",
workPhone: "1111111111",
};
const renderChildren = (list, reportingTo) => {
let array = [];
let dataArray = [...list];
dataArray.map((item, i) => {
if (item.reportingTo == reportingTo) {
array.push(item);
list.splice(i, 1);
}
});
return array;
};
let ceoChildren = renderChildren(data, "Rashid"); // In this case we are getting all the employees who are reporting to ceo whose name is Rashid
預期結果應該是
let data = {
department: "management",
designation: "ceo",
employeeId: "1",
fullName: "Rashid",
reportingTo: "null",
workEmail: "ceo@gmail.com",
workPhone: "1111111111",
children: [
{
department: "development",
designation: "lead",
employeeId: "2",
fullName: "Kashif",
reportingTo: "Rashid",
workEmail: "lead@gmail.com",
workPhone: "2222222222",
},
{
department: "development",
designation: "Developer",
employeeId: "11",
fullName: "Kiran",
reportingTo: "Rashid",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
children: [
{
department: "development",
designation: "Developer",
employeeId: "5",
fullName: "Mani",
reportingTo: "Kiran",
workEmail: "developer@gmail.com",
workPhone: "5555555555",
children: [
{
department: "development",
designation: "Developer",
employeeId: "7",
fullName: "Waseem",
reportingTo: "Mani",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
children: [
{
department: "development",
designation: "Developer",
employeeId: "8",
fullName: "Munir",
reportingTo: "Waseem",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
children: [
{
department: "development",
designation: "Developer",
employeeId: "9",
fullName: "Maaz",
reportingTo: "Munir",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
children: [
{
department: "development",
designation: "Developer",
employeeId: "10",
fullName: "Hazma",
reportingTo: "Maaz",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
{
department: "development",
designation: "Developer",
employeeId: "11",
fullName: "Muhammad",
reportingTo: "Maaz",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
],
},
],
},
],
},
],
},
{
department: "development",
designation: "Developer",
employeeId: "6",
fullName: "Joseph",
reportingTo: "Kiran",
workEmail: "developer@gmail.com",
workPhone: "6666666666",
},
],
},
{
department: "development",
designation: "UI Developer",
employeeId: "3",
fullName: "Sharif",
reportingTo: "Rashid",
workEmail: "ui@gmail.com",
workPhone: "3333333333",
},
{
department: "development",
designation: "UX Developer",
employeeId: "4",
fullName: "Naveen",
reportingTo: "Rashid",
workEmail: "ux@gmail.com",
workPhone: "4444444444",
},
],
};
您可以創建一個普通對象(作為字典),以名稱為鍵,並且每個鍵都具有與該名稱相關的對象作為對應值。
然后使用fullName
、 reportingTo
對來使用為這些名稱找到的對象填充children
數組。
最后,返回一個對象,其中包含根列表和用於按名稱查找節點的字典。
這是一個實現:
function createTree(data) { const nodes = Object.fromEntries(data.map(o => [o.fullName, o])); const roots = []; nodes.null = { children: roots }; for (let {fullName, reportingTo} of data) { (nodes[reportingTo].children ??= []).push(nodes[fullName]); } return {nodes,roots}; } const data = [{department: "development",designation: "lead",employeeId: "2",fullName: "Kashif",reportingTo: "Rashid",workEmail: "lead@gmail.com",workPhone: "2222222222",},{department: "development",designation: "UI Developer",employeeId: "3",fullName: "Sharif",reportingTo: "Rashid",workEmail: "ui@gmail.com",workPhone: "3333333333",},{department: "development",designation: "UX Developer",employeeId: "4",fullName: "Naveen",reportingTo: "Rashid",workEmail: "ux@gmail.com",workPhone: "4444444444",},{department: "development",designation: "Developer",employeeId: "5",fullName: "Mani",reportingTo: "Kiran",workEmail: "developer@gmail.com",workPhone: "5555555555",},{department: "development",designation: "Developer",employeeId: "6",fullName: "Joseph",reportingTo: "Kiran",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "7",fullName: "Waseem",reportingTo: "Mani",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "8",fullName: "Munir",reportingTo: "Waseem",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "9",fullName: "Maaz",reportingTo: "Munir",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "10",fullName: "Hazma",reportingTo: "Maaz",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "11",fullName: "Muhammad",reportingTo: "Maaz",workEmail: "developer@gmail.com",workPhone: "6666666666",},{department: "development",designation: "Developer",employeeId: "11",fullName: "Kiran",reportingTo: "Rashid",workEmail: "developer@gmail.com",workPhone: "6666666666",},]; const ceo = {department: "management",designation: "ceo",employeeId: "1",fullName: "Rashid",reportingTo: "null",workEmail: "ceo@gmail.com",workPhone: "1111111111",}; // Initialise tree -- no need to distinguish the ceo; could be in same array const tree = createTree(data.concat(ceo)); // Perform access in tree by name: const ceoChildren = tree.nodes["Rashid"]; console.log(ceoChildren); // Or by root: const root = tree.roots[0]; console.log(root === ceoChildren); // true
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.