Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript将对象数组中的值按相同的值分组?_Javascript_Reactjs - Fatal编程技术网

如何使用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
是一个已命名属性的占位符,它不再需要了。