Javascript 如何按对象属性对数组进行分组

Javascript 如何按对象属性对数组进行分组,javascript,arrays,Javascript,Arrays,我有阵列重复数据。 我需要集合一组阵列 const data = [ { id: 1, name: "john", cardId: "0001" }, { id: 1, name: "john", cardId: "0001" }, { id: 1, name: "john", cardId: "0002" }, { id: 2, name: "poul", cardId: "0003" }, { id: 2, name: "poul", cardI

我有阵列重复数据。 我需要集合一组阵列

const data = [
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0001" }, 
    { id: 1, name: "john", cardId: "0002" }, 
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0003" },
    { id: 2, name: "poul", cardId: "0004" }
];
我需要组重复数据。走到一起,只有一个 像这样>>

const res = [ 
    { id: 1, name: "john", card: [{ cardId: "0001" }, { cardId: "0002"} ] },
    { id: 2, name: "poul", card: [{ cardId: "0003" }, { cardId: "0004"} ] } 
];
非常感谢您的帮助。

const数据=
[{id:1,名字:“约翰”,卡迪德:“0001”},{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:'john',cardId'0002'},{id:2,名字:'poul',cardId'0003'},
{id:2,名称:'poul',cardId:'0003'},{id:2,名称:'poul',cardId:'0004'}];
让grouped=data.reduce((acc,{id,name,cardId})=>{
设d=acc.find(d=>d.id==id);
如果(!d)
acc.push({id、姓名、卡:[cardId]});
如果(!d.card.包括(cardId))则为else
d、 卡.推(卡);
返回acc;
}, []);
控制台日志(分组)
const数据=
[{id:1,名字:“约翰”,卡迪德:“0001”},{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:'john',cardId'0002'},{id:2,名字:'poul',cardId'0003'},
{id:2,名称:'poul',cardId:'0003'},{id:2,名称:'poul',cardId:'0004'}];
让grouped=data.reduce((acc,{id,name,cardId})=>{
设d=acc.find(d=>d.id==id);
如果(!d)
acc.push({id、姓名、卡:[cardId]});
如果(!d.card.包括(cardId))则为else
d、 卡.推(卡);
返回acc;
}, []);
控制台日志(分组)
var数据=[
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0002”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0004”}
];
var-res=[];
data.forEach(a=>{
var searchResultInRes=res.find(x=>x.id==a.id);
如果(searchResultInRes){
如果(!searchResultInRes.card.some(x=>x.cardId==a.cardId)){
searchResultInRes.card.push({cardId:a.cardId});
}
}否则{
res.push({id:a.id,name:a.name,card:[{cardd:a.cardd}]});
}
});
控制台日志(res)
var数据=[
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0002”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0004”}
];
var-res=[];
data.forEach(a=>{
var searchResultInRes=res.find(x=>x.id==a.id);
如果(searchResultInRes){
如果(!searchResultInRes.card.some(x=>x.cardId==a.cardId)){
searchResultInRes.card.push({cardId:a.cardId});
}
}否则{
res.push({id:a.id,name:a.name,card:[{cardd:a.cardd}]});
}
});
控制台日志(res)
您可以使用来根据
名称对项目进行分组。创建一个名为
card
的属性,为每个
名称
获取唯一的
cardd
s。然后在集合中循环以创建输出

const数据=[
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0002”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0004”}
];
const merged=data.reduce((r,{id,name,cardId})=>{
r[name]=r[name]|{id,name,card:newset};
r[name].card.add(cardd)
返回r;
}, {})
const output=Object.values(合并).map({card,id,name})=>
({id,name,card:[…card].map(cardd=>({cardd})))
console.log(输出)
您可以使用它根据
名称对项目进行分组。创建一个名为
card
的属性,为每个
名称
获取唯一的
cardd
s。然后在集合中循环以创建输出

const数据=[
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0001”},
{id:1,名字:“约翰”,卡迪德:“0002”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0003”},
{id:2,名称:“poul”,卡迪德:“0004”}
];
const merged=data.reduce((r,{id,name,cardId})=>{
r[name]=r[name]|{id,name,card:newset};
r[name].card.add(cardd)
返回r;
}, {})
const output=Object.values(合并).map({card,id,name})=>
({id,name,card:[…card].map(cardd=>({cardd})))

console.log(输出)
数据是否总是按id/名称排序?数据是否总是按id/名称排序?