[英]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.