Javascript 如何使用值对嵌套数组对象进行分组

Javascript 如何使用值对嵌套数组对象进行分组,javascript,Javascript,我有一个下面的对象,我试图使用部门和子部门值对数据进行分组。我曾尝试在部门名称上使用reduce函数,但未能达到预期效果 例如,我有一个部门对象数组: var arr=//实际对象 [{ “部门”:“管理员”, “附属部门”:[{ “名称”:“财务”, “申请”:[{ “名称”:“F1”, “标签”:100 }] }] }, { “部门”:“管理员”, “附属部门”:[{ “名称”:“注册表”, “申请”:[{ “名称”:“R2”, “标签”:200 }] }] }, { “部门”:“管理员”

我有一个下面的对象,我试图使用部门和子部门值对数据进行分组。我曾尝试在部门名称上使用reduce函数,但未能达到预期效果

例如,我有一个部门对象数组:

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);