Javascript Js使用公共密钥对项目进行分组

Javascript Js使用公共密钥对项目进行分组,javascript,arrays,object,Javascript,Arrays,Object,我希望通过指定键,确保具有以下共同键的对象被放置在相同的数组位置 我是这样做的,但我想知道是否有更好的方法 我真的不喜欢用地图 a=[ { “id”:“1”, “船”:{ “许可证牌照”:“AR002”, }, “from”:“2020-06-20T16:09:00.000Z”, “收件人”:“2020-06-23T16:09:00.000Z”, }, { “id”:“5”, “船”:{ “许可证铭牌”:“AZ001”, }, “从”:“2020-06-19T22:00:00.000Z”, “

我希望通过指定键,确保具有以下共同键的对象被放置在相同的数组位置

我是这样做的,但我想知道是否有更好的方法

我真的不喜欢用地图

a=[
{
“id”:“1”,
“船”:{
“许可证牌照”:“AR002”,
},
“from”:“2020-06-20T16:09:00.000Z”,
“收件人”:“2020-06-23T16:09:00.000Z”,
},
{
“id”:“5”,
“船”:{
“许可证铭牌”:“AZ001”,
},
“从”:“2020-06-19T22:00:00.000Z”,
“收件人”:“2020-06-22T21:59:00.000Z”,
},
{
“id”:“2”,
“船”:{
“许可证牌照”:“AR002”,
},
“from”:“2020-06-20T16:09:00.000Z”,
“收件人”:“2020-06-23T16:09:00.000Z”,
},
{
“id”:“3”,
“船”:{
“许可证铭牌”:“AZ001”,
},
“from”:“2020-06-20T18:00:00.000Z”,
“收件人”:“2020-06-21T18:00:00.000Z”,
},
{
“id”:“4”,
“船”:{
“许可证铭牌”:“AZ001”,
},
“从”:“2020-06-19T22:00:00.000Z”,
“收件人”:“2020-06-22T21:59:00.000Z”,
}
];
函数groupBy(列表,keyGetter){
常量映射=新映射();
list.map((项目)=>{
const key=keyGetter(项).join(“,”);
const collection=map.get(键);
if(!collection)map.set(键,[项]);
else集合。推送(项目);
});
返回图;
}
const group=groupBy(a,c=>[c.boat.licensePlate,c.from,c.to]);
const events=Array.from(分组,([id,ev])=>({
身份证件
标题:ev[0].boat.licensePlate,
全天:错,
开始:新日期(ev[0]。起始日期),
结束:新日期(ev[0]。至)
}))

console.log(事件)
您可以在这里使用
reduce
,我想这就是您需要的:

var a=[{“id”:“1”,“boat”:{“licensePlate”:“AR002”,},“from”:“2020-06-20T16:09:00.000Z”,“to”:“2020-06-23T16:09:00.000Z”,},{“id”:“5”,“boat”:{“licensePlate”:“AZ001”,},“from”:“2020-06-19T22:00.000Z”,“to”:“2020-06-22T21:59:00.000Z”,},{“id”:“2”,“boat”:“boat”:“licensePlate”from“ar06-0006:00”,to:“2020-06-23T16:09:00.000Z,”,{“id:“3”,“船”:{“许可证”:“AZ001”,},from:“2020-06-20T18:00:00.000Z”,“to:“2020-06-21T18:00:00.000Z”,},{“id:“4”,“船”:{“许可证”:“AZ001”,},“from:“2020-06-19T22:00.000Z”,“to:”2020-06-22T21:59:00.000Z,});
var result=Object.values(a.reduce((acc,{id,boat,…rest})=>{
const key=[…Object.values(rest),boat.licenseplate].join(“|”);
acc[key]=[…(acc[key]| |[]),{id,船,…休息};
返回acc;
},{}));

控制台日志(结果)你应该使用另一个答案中提到的
减少

使用这种方法,您可以通过“在
a
上迭代一次”来删除“重复项”,通过组合
“${licensePlate}、${from}、${to}”来生成新的唯一id

const a=[{
“id”:“1”,
“船”:{“牌照”:“AR002”},
“from”:“2020-06-20T16:09:00.000Z”,
“收件人”:“2020-06-23T16:09:00.000Z”,
}, {
“id”:“5”,
“船”:{“牌照”:“AZ001”},
“从”:“2020-06-19T22:00:00.000Z”,
“收件人”:“2020-06-22T21:59:00.000Z”,
}, {
“id”:“2”,
“船”:{“牌照”:“AR002”},
“from”:“2020-06-20T16:09:00.000Z”,
“收件人”:“2020-06-23T16:09:00.000Z”,
}, {
“id”:“3”,
“船”:{“牌照”:“AZ001”},
“from”:“2020-06-20T18:00:00.000Z”,
“收件人”:“2020-06-21T18:00:00.000Z”,
}, {
“id”:“4”,
“船”:{“牌照”:“AZ001”},
“从”:“2020-06-19T22:00:00.000Z”,
“收件人”:“2020-06-22T21:59:00.000Z”,
}];
函数getUniqueObjects(输入){
返回Object.values(input.reduce((updatedList{
身份证件
船:{
牌照
},
休息
}) => {
const newId=`${licensePlate},${rest.from},${rest.to}`;
如果(!updatedList[newId]){
updatedList[newId]={
id:newId,
标题:牌照,
全天:错,
开始:新日期(剩余时间从),
结束:新日期(剩余至),
}
}
返回更新列表;
}, {}));
}

log(getUniqueObjects(a))
list.map()
未分配到任何位置,因此它应该是
list.forEach()
。无论如何,可能是一个更好的问题。请具体说明:您是否试图将具有相同车牌的对象放入数组,以便每个数组包含具有相同车牌的条目?你试过什么?您遇到的具体问题是什么?