簡體   English   中英

如何使用javascript按相同的值對對象數組中的值進行分組?

[英]How to group values from an array of objects by same values with javascript?

我有一個對象數組如下

[
0: {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 1, …}
1: {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 2, …}
2: {department_ID: 1, department_Name: "HR & Admin", section_ID: 20, section_Name: "HR and Admin", employee_ID: 90, …}
   ...
]

我想要實現的是按順序相同的department_ID section_ID > 相同的section_ID和最后像這樣的員工數據對數組中的值進行分組

[
  {
    department_ID: 6,
    department_Name: "Management",
    children: [
      {
        section_ID: 12,
        section_Name: "General Management",
        children: [
          {
            employee_ID: 1,
            employee_Name: "",
          },
          {
            employee_ID: 2,
            employee_Name: "",
          },
        ],
      },
    ],
  },
  {
    department_ID: 1,
    department_Name: "HR & Admin",
    children: [
      {
        section_ID: 20,
        section_Name: "HR and Admin",
        children: [
          {
            employee_ID: 90,
            employee_Name: "",
          },
        ],
      },
    ],
  },
];

我試過了

function getUnique() {
  var hashObject = {};
  let obj = {};

  treeviewApiValues.forEach(function (elem) {
    var key = elem.department_ID;
    if (hashObject[key]) {
      hashObject[key] = {
        id: elem.department_ID,
        name: elem.department_Name,
        children: checkSectionID(elem),
      };
    } else {
      hashObject[key] = {
        id: elem.department_ID,
        name: elem.department_Name,
        children: checkSectionID(elem),
      };
    }
  });

  function checkSectionID(elem) {
    const key = elem.department_ID;

    if (obj[key]) {
      obj[key].push({
        id: elem.section_ID,
        name: elem.section_Name,
      });
    } else {
      obj[key] = [
        {
          id: elem.section_ID,
          name: elem.section_Name,
        },
      ];
    }

    var desiredArray2 = Object.values(obj);

    return desiredArray2;
  }

  var desiredArray = Object.values(hashObject);
}

這是一個凌亂的功能,但我明白了

[
0: {department_ID: 1, department_Name: "HR & Admin", children: Array(7)}
1: {department_ID: 2, department_Name: "ELV Systems Installation & Service", children: Array(7)}
]

兒童數組有問題,沒有相同部門 ID 的數組,我還需要獲取相同 section_ID 下的員工數據。 如果有人可以幫助我,我將不勝感激。

完整代碼可以在這里找到https://codesandbox.io/s/gracious-voice-bbmsy?file=/src/App.js

您可以對分組級別的數組采用嵌套方法。

此解決方案從對象中刪除不需要的屬性,並將最終對象推送到嵌套最多的子數組。

此解決方案適用於任意數量的級別。

 const data = [{ department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 1 }, { department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 2 }, { department_ID: 1, department_Name: "HR & Admin", section_ID: 20, section_Name: "HR and Admin", employee_ID: 90 }], groups = [['department_ID', 'department_Name'], ['section_ID', 'section_Name']], result = data.reduce((r, o) => { groups .reduce((group, keys) => { let temp = group.find(q => q[keys[0]] === o[keys[0]]); if (!temp) group.push(temp = { ...Object.fromEntries(keys.map(k => [k, o[k]])), children: [] }); keys.forEach(k => ({ [k]: _, ...o} = o)); return temp.children; }, r) .push(o); return r; }, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

也許它可以解決您的任務

let list = [
    {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 1, …},
    {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 2, …},
    {department_ID: 1, department_Name: "HR & Admin", section_ID: 20, section_Name: "HR and Admin", employee_ID: 90, …}
    ...
];

let vals = [];
list.map(v=>{
    vals[v.department_ID] || (vals[v.department_ID] = {
        department_ID: v.department_ID,
        department_Name: v.department_Name,
        children: []
    });

    vals[v.department_ID].children[v.section_ID] || 
    (vals[v.department_ID].children[v.section_ID] = {
        section_ID: v.section_ID,
        section_Name: v.section_Name,
        children: []
    });

    vals[v.department_ID].children[v.section_ID].children.push({
        employee_ID: v.employee_ID,
        employee_Name: v.employee_Name
    });

});

vals = vals.filter(e=>!!e);
let result = vals.map(e=>{
    e.children = e.children.filter(v=>!!v);
    return e;
});

您可以使用reduce()find()如下:

 const arr = [ {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 1, employee_name: 'john'}, {department_ID: 6, department_Name: "Management", section_ID: 12, section_Name: "General Management", employee_ID: 2, employee_name: 'avi'}, {department_ID: 1, department_Name: "HR & Admin", section_ID: 20, section_Name: "HR and Admin", employee_ID: 90, employee_name: 'jennifer'} ] const res = arr.reduce((acc, curr) => { const obj = acc.find(item => item.department_ID === curr.department_ID && item?.children[0]?.section_ID === curr.section_ID); if(obj) { obj.children[0].children.push({ employee_ID: curr.employee_ID, employee_name: curr.employee_name}); } else { acc.push({ department_ID: curr.department_ID, department_Name: curr.department_Name, children: [ { section_ID: curr.section_ID, section_Name: curr.section_Name, children: [{ employee_ID: curr.employee_ID, employee_name: curr.employee_name }] } ] }) } return acc; }, []); console.log(res);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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