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)
我已经批准了更新后的问题,感谢您的反馈。
我目前正在从数组中删除重复的对象
,从技术上讲,这不是您的问题,而是您从筛选器中创建了一个新数组……)这是我正在寻找的干净方法。感谢清洁的解决方案!