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个道具,不仅仅是名称
<代码>姓名
和年龄
。