如何使用javascript将对象数组中的值按相同的值分组?
我有一个对象数组,如下所示如何使用javascript将对象数组中的值按相同的值分组?,javascript,reactjs,Javascript,Reactjs,我有一个对象数组,如下所示 [ 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_Nam
[
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, …}
...
]
我想要实现的是,按照相同的部门ID
>相同的部分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)}
]
Children数组出错,没有相同部门ID的数组,我还需要获取相同部门ID下的员工数据。
如果有人能帮助我,我将不胜感激
完整代码可在此处找到您可以采用嵌套方法,使用数组进行分组级别 此解决方案从对象中删除不需要的属性,并将最终对象推送到嵌套最多的子数组中 此解决方案适用于任意数量的级别
const
数据=[{部门ID:6,部门名称:“管理”,部门ID:12,部门名称:“一般管理”,员工ID:1},{部门ID:6,部门名称:“管理”,部门ID:12,部门名称:“一般管理”,员工ID:2},{部门ID:1,部门名称:“人力资源和行政”,部门ID:20,部门名称:“人力资源和行政”,雇员编号:90}],
组=['department\u ID','department\u Name'],['section\u ID','section\u Name'],
结果=数据。减少((r,o)=>{
组
.减少((组、键)=>{
让temp=group.find(q=>q[keys[0]]==o[keys[0]]);
如果(!temp)group.push(temp={…Object.fromEntries(keys.map(k=>[k,o[k]]),子项:[]});
forEach(k=>({[k]:,…o}=o));
返回临时儿童;
},r)
.推(o);
返回r;
}, []);
控制台日志(结果)代码>
.as控制台包装{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=[
{部门ID:6,部门名称:“管理”,部门ID:12,部门名称:“一般管理”,员工ID:1,员工名称:“约翰”},
{部门ID:6,部门名称:“管理”,部门ID:12,部门名称:“一般管理”,员工ID:2,员工名称:“avi”},
{部门ID:1,部门名称:“人力资源与行政”,部门ID:20,部门名称:“人力资源与行政”,员工ID:90,员工名称:“詹妮弗”}
]
常数res=arr.reduce((acc,curr)=>{
const obj=acc.find(item=>item.department\u ID===curr.department\u ID&&item?.children[0]?.section\u ID==curr.section\u ID);
如果(obj){
obj.children[0].children.push({employee_ID:curr.employee_ID,employee_name:curr.employee_name});
}否则{
加速推({
部门ID:当前部门ID,
部门名称:当前部门名称,
儿童:[
{
截面ID:当前截面ID,
区段名称:当前区段名称,
儿童:[{
员工ID:当前员工ID,
员工姓名:当前员工姓名
}]
}
]
})
}
返回acc;
}, []);
控制台日志(res)代码>这正是我需要的!谢谢。但有一件事是,当我进行测试时,\uu
显示未定义。我想你忘了添加键。forEach((k,)=>…)
,无论如何,谢谢不,因为\u
是一个已命名属性的占位符,它不再需要了。