Javascript 如何使用值对嵌套数组对象进行分组
我有一个下面的对象,我试图使用部门和子部门值对数据进行分组。我曾尝试在部门名称上使用reduce函数,但未能达到预期效果 例如,我有一个部门对象数组:Javascript 如何使用值对嵌套数组对象进行分组,javascript,Javascript,我有一个下面的对象,我试图使用部门和子部门值对数据进行分组。我曾尝试在部门名称上使用reduce函数,但未能达到预期效果 例如,我有一个部门对象数组: var arr=//实际对象 [{ “部门”:“管理员”, “附属部门”:[{ “名称”:“财务”, “申请”:[{ “名称”:“F1”, “标签”:100 }] }] }, { “部门”:“管理员”, “附属部门”:[{ “名称”:“注册表”, “申请”:[{ “名称”:“R2”, “标签”:200 }] }] }, { “部门”:“管理员”
var arr=//实际对象
[{
“部门”:“管理员”,
“附属部门”:[{
“名称”:“财务”,
“申请”:[{
“名称”:“F1”,
“标签”:100
}]
}]
},
{
“部门”:“管理员”,
“附属部门”:[{
“名称”:“注册表”,
“申请”:[{
“名称”:“R2”,
“标签”:200
}]
}]
},
{
“部门”:“管理员”,
“附属部门”:[{
“名称”:“财务”,
“申请”:[{
“名称”:“F2”,
“标签”:200
}]
}]
},
{
“部门”:“帮助台”,
“附属部门”:[{
“名称”:“条目”,
“申请”:[{
“名称”:“E1”,
“标签”:200
}]
}]
}
]
//在代码下面尝试
var结果=arr.reduce(函数(r,a){
r[a.部门]=r[a.部门]| |[];
r[a.部门].推送(a);
返回r;
},Object.create(null));
console.log(result)
您实际上非常接近。只需将对象构建为哈希表值,并使用Object.values
将哈希表转换为数组:
var result = Object.values(arr.reduce(function(r, a) { //<--- the hashtable > array conversion
r[a.department] = r[a.department] || {
department: a.department,
sub_department:[]
}; // <-- objects instead of arrays in the hashtable
r[a.department].sub_department.push(...a.sub_department); //and add the subdepartment not the object itself
return r;
}, Object.create(null)));
console.log(result);
此外,将下属部门分组可能会稍微复杂一些。为此,我们需要一个嵌套哈希表和一个嵌套查找:
const exit = Symbol("exit");
const result = [], hash = {};
for(const {department, sub_department} of arr){
if(!hash[department]){
const sub = [];
hash[department] = {[exit]: sub};
result.push({department, sub_department: sub});
}
for(const {name, ...data} of sub_department){
if(hash[department][name]){
hash[department][name].push(data);
} else {
const subsub = [];
hash[department][exit].push({name, subsub});
hash[department][name] = subsub;
}
}
}
有点冗长的解决方案扩展了以前发布的解决方案:
var result = Object.values(arr.reduce(function(r, a) { //<--- the hashtable > array conversion
r[a.department] = r[a.department] || {
department: a.department,
sub_department:[]
}; // <-- objects instead of arrays in the hashtable
if(r[a.department].sub_department.length>0){
var index = r[a.department].sub_department.findIndex(function(sd){
return sd.name === a.sub_department[0].name;
});
if(index!==-1){
r[a.department].sub_department[index].application.push(a.sub_department[0].application[0]);
return r;
}
}
r[a.department].sub_department.push(...a.sub_department); //and add the sub department not the object itself
return r;
}, Object.create(null)));
console.log(result);
var result=Object.values(arr.reduce)(函数(r,a){//数组转换
r[a.部门]=r[a.部门]|{
部门:a.部门,
分部:[]
}; // 0){
var index=r[a.department]。子部门。findIndex(功能(sd){
返回sd.name==a.sub\u部门[0]。名称;
});
如果(索引!=-1){
r[a.department].sub_department[index].application.push(a.sub_department[0].application[0]);
返回r;
}
}
r[a.department].sub_department.push(…a.sub_department);//并添加子部门而不是对象本身
返回r;
},Object.create(null));
控制台日志(结果);
子部门分组的可能重复项未按预期工作,无法获得预期结果
var result = Object.values(arr.reduce(function(r, a) { //<--- the hashtable > array conversion
r[a.department] = r[a.department] || {
department: a.department,
sub_department:[]
}; // <-- objects instead of arrays in the hashtable
if(r[a.department].sub_department.length>0){
var index = r[a.department].sub_department.findIndex(function(sd){
return sd.name === a.sub_department[0].name;
});
if(index!==-1){
r[a.department].sub_department[index].application.push(a.sub_department[0].application[0]);
return r;
}
}
r[a.department].sub_department.push(...a.sub_department); //and add the sub department not the object itself
return r;
}, Object.create(null)));
console.log(result);