簡體   English   中英

深層次數據樹

[英]deep hierarchy data tree

嗨,我幾周以來一直面臨一個問題並且無法解決,我有一個對象數組,其中我幾乎沒有像fullNamereportingTo這樣的屬性,然后我有另一個對象是 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",
    },
  ],
};


您可以創建一個普通對象(作為字典),以名稱為鍵,並且每個鍵都具有與該名稱相關的對象作為對應值。

然后使用fullNamereportingTo對來使用為這些名稱找到的對象填充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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM