JavaScript按相同的值对相似的对象进行分组

JavaScript按相同的值对相似的对象进行分组,javascript,arrays,Javascript,Arrays,我有一个对象数组,我需要按相同的值对它们进行分组,我需要按多维数组对它们进行分组 const source = [ {name: 'A', age: 23, id: 0}, {name: 'A', age: 23, id: 1}, {name: 'B', age: 15, id: 34}, {name: 'B', age: 15, id: 45},

我有一个对象数组,我需要按相同的值对它们进行分组,我需要按多维数组对它们进行分组

const source = [
                 {name: 'A', age: 23, id: 0}, 
                 {name: 'A', age: 23, id: 1},
                 {name: 'B', age: 15, id: 34}, 
                 {name: 'B', age: 15, id: 45},
                 {name: 'B', age: 15, id: 32},
                 {name: 'C', age: 15, id: 32},
               ];


[
与此结构类似,所有相同的对象都应该在一个数组中按数组分组

  [
   {name: 'A', age: 23, id: 0}, 
   {name: 'A', age: 23, id: 1}
  ],
  [
   {name: 'B', age: 15, id: 34}, 
   {name: 'B', age: 15, id: 45},
   {name: 'B', age: 15, id: 32}
  ],
  [
   {name: 'C', age: 15, id: 32},
  ]
]
我试过这样做,但没有成功

const result = source.reduce((accumulator, item) => {
    if (accumulator && accumulator.length) {
      const found = accumulator.find(group => {
        return group && group.length
          ? group.find(_transaction =>
              // check the same object 
              return false
            )
          : false;
      });
      if (found) {

        console.log(found);
      }
    } else {
      accumulator.push([item]);
    }

    return accumulator;
  }, []);

创建一个由
name
属性索引的对象,该属性的值是包含
项的数组,然后获取该对象的值:

const源=[
{姓名:'A',年龄:23,id:0},
{姓名:'A',年龄:23,id:1},
{姓名:'B',年龄:15岁,身份证号码:34},
{姓名:'B',年龄:15岁,身份证号码:45},
{姓名:'B',年龄:15岁,身份证号码:32},
{姓名:'C',年龄:15岁,id:32},
];
const sourceItemsByName={};
用于(源的常量对象){
如果(!sourceItemsByName[obj.name]){
sourceItemsByName[obj.name]=[];
}
sourceItemsByName[obj.name].push(obj);
}
const output=Object.values(sourceItemsByName);

控制台日志(输出)您可以找到组数组,如果找到,则添加对象或向结果集中添加新组

const
source=[{name:'A',age:23,id:0},{name:'A',age:23,id:1},{name:'B',age:15,id:34},{name:'B',age:15,id:45},{name:'B',age:15,id:32},{name:'C',age:15,id:32}],
组=['name','age'],
分组=源。减少((r,o)=>{
var temp=r.find(([q])=>groups.every(k=>o[k]==q[k]);
如果(临时){
温度推力(o);
}否则{
r、 推挤([o]);
}
返回r;
}, []);
控制台日志(分组)

.as console wrapper{max height:100%!important;top:0;}
您可以使用
名称
年龄
组合作为键,将数组简化为一个映射。然后将
Map.values()迭代器传回数组:

const source=[{name:'A',age:23,id:0},{name:'A',age:23,id:1},{name:'B',age:15,id:34},{name:'B',age:45},{name:'B',age:15,id:32},{name:'C',age:15,id:32}];
const result=[…//将值迭代器分散到数组中
来源.减少((r,o)=>{
const key=`${o.name}-${o.age}`;//生成一个包含name和age的键
if(!r.has(key))r.set(key,[]);//如果key不在映射中,则为其添加新条目
r、 get(key).push(o);//将当前对象推送到key的条目
返回r;
},新映射())
.values()//获取映射值迭代器
];

控制台日志(结果)我认为下面的代码更容易理解。希望对你有帮助。谢谢

更新:正如您需要在注释中提到的,您需要
name
age
属性作为键值

const源=[
{姓名:'A',年龄:23,id:0},
{姓名:'A',年龄:23,id:1},
{姓名:'B',年龄:15岁,身份证号码:34},
{姓名:'B',年龄:15岁,身份证号码:45},
{姓名:'B',年龄:15岁,身份证号码:32},
{姓名:'C',年龄:15岁,id:32},
];
var hashObject={}
source.forEach(函数(elem){
var key=elem.name+elem.age;
if(hashObject[key]){
hashObject[key].push(元素);
}否则{
hashObject[key]=[elem];
}
});
var desiredaray=Object.values(hashObject);

控制台日志(desiredArray)谢谢@Nina Scholz,但我需要匹配2个道具,不仅仅是
名称
<代码>姓名
和年龄