Javascript 如何基于2个属性删除阵列中的重复对象?
我有一个房间对象数组,目前正在根据其Javascript 如何基于2个属性删除阵列中的重复对象?,javascript,arrays,filter,ecmascript-6,Javascript,Arrays,Filter,Ecmascript 6,我有一个房间对象数组,目前正在根据其房间率\u type\u id属性从数组中删除重复的对象: const rooms=[{ 房间价格类型id:202, 售价:200 }, { 房间价格类型id:202, 售价:200 }, { 房间价格类型id:202, 价格:189 }, { 房价类型id:190, 售价:200 } ]; const newRooms=rooms.filter((房间、索引、数组)=>{ const roomrateTypeID=rooms.map(room=>room.
房间率\u type\u id
属性从数组中删除重复的对象:
const rooms=[{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
价格:189
},
{
房价类型id:190,
售价:200
}
];
const newRooms=rooms.filter((房间、索引、数组)=>{
const roomrateTypeID=rooms.map(room=>room.room\u rate\u type\u id);
//返回找到的第一个索引。
返回RoomRateTypeId.indexOf(room.room\u rate\u type\u id)==索引;
});
控制台日志(newRooms)代码>您可以执行以下操作
const rooms=[
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
价格:189
},
{
房价类型id:190,
售价:200
}
];
让结果=房间。过滤器((e,i)=>{
返回房间。findIndex((x)=>{
返回x.room\u rate\u type\u id==e.room\u rate\u type\u id&&x.price==e.price;})==i;
});
控制台日志(结果)代码>简单方法:使用房价类型id
和价格
键的串联作为唯一键:
const rooms=[
{房价类型识别码:202,价格:200},{房价类型识别码:202,价格:200},{房价类型识别码:202,价格:189},{房价类型识别码:190,价格:200}
];
常量roomRateKeys=[];
const newRooms=rooms.filter((r,i,a)=>{
var k=r.房间价格类型id+“”+r.价格;
if(roomRateKeys.indexOf(k)=-1){
RoomRate键。按(k);
返回r;
}
});
控制台日志(newRooms)代码>对于较小的阵列,您可以通过重复查找其他匹配的房间来执行此操作:
const newRooms = rooms.filter((room, index) => {
// Only include this room if there isn't another room earlier
// in the array that has the same values
return !rooms.some((r, i) =>
i < index &&
r.room_rate_type_id == room.room_rate_type_id &&
r.price == room.price
);
});
这可以做到:
const rooms=[{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
价格:189
},
{
房价类型id:190,
售价:200
}
];
const newRooms=房间。reduce((房间,房间)=>{
let l=房间。过滤器(r=>{
返回r.room\u rate\u type\u id==room.room\u rate\u type\u id&&r.price==room.price;
});
如果(l.length==0){
返回[…房间,房间]
}
返回室;
},[房间[0]];
控制台日志(newRooms)代码>
.as console wrapper{max height:100%!important;top:0;}
您可以通过从这两个属性创建一个键将数组添加到对象,并且仅当键不存在时才将对象添加到映射中。然后将背面展开到阵列中:
const rooms=[{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
价格:189
},
{
房价类型id:190,
售价:200
}
];
const newRooms=[…rooms.reduce((m,r)=>{
const key=`${r.room\u rate\u type\u id}-${r.price}`;//通过组合两个道具来创建密钥
返回m.has(key)→m:m.set(key,r);//如果key存在,跳过,如果不添加到映射
},新映射())。值()];//获取映射值并转换回数组
控制台日志(newRooms)代码>
const rooms=[
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
售价:200
},
{
房间价格类型id:202,
价格:189
},
{
房价类型id:190,
售价:200
}
];
设newRooms=rooms.filter((x,i,arr)=>arr.findIndex(y=>y.rooms\u rate\u type\u id==x.rooms\u rate\u type\u id&&y.price==x.price)==i);
控制台日志(newRooms)
我已经批准了更新后的问题,感谢您的反馈。我目前正在从数组中删除重复的对象
,从技术上讲,这不是您的问题,而是您从筛选器中创建了一个新数组……)这是我正在寻找的干净方法。感谢清洁的解决方案!