data = [{
id: "txv3vvBr8KYB",
name: "room 1"
},{
id: "txv3vvBr8KJB",
name: "room 2"
},{
id: "txv3vvBr8K",
name: "room 4"
},{
id: "txv3vvBr8LKP",
name: "room 3"
},{
id: "txv3vvBr8LDS",
name: "room 5"
}]
roomList = [
{
room: {
code: "r001",
id: "txv3vvBr8KYB",
name: "room 1",
status: "FULL"
}
},
{
room: {
code: "r002",
id: "txv3vvBr8KJB",
name: "room 2",
status: "FULL"
}
},
{
room: {
code: "r003",
id: "txv3vvBr8LKP",
name: "room 3",
status: "FULL"
}
}
]
Здесь я пытаюсь отфильтровать данные из roomList и удалить элемент из данных, когда они имеют одинаковые идентификаторы.
ожидаемый результат должен быть таким:
data = [{
id: "txv3vvBr8K",
name: "room 4"
}{
id: "txv3vvBr8LDS",
name: "room 5"
}]
Пробовал использовать фильтр и карту.
this.data.filter((x: any) => this.roomList.map((y: any) => y['room']['id] === x['id']);
Вероятно, лучше всего сначала уменьшить() идентификаторы комнат в Set , а затем filter() на основе этого:
const ids = roomList.reduce((a, {room: {id}}) => (a.add(id), a), new Set());
const result = data.filter(({id}) => !ids.has(id));
Полный фрагмент:
const data = [{
id: "txv3vvBr8KYB",
name: "room 1"
}, {
id: "txv3vvBr8KJB",
name: "room 2"
}, {
id: "txv3vvBr8K",
name: "room 4"
}, {
id: "txv3vvBr8LKP",
name: "room 3"
}, {
id: "txv3vvBr8LDS",
name: "room 5"
}];
const roomList = [{
room: {
code: "r001",
id: "txv3vvBr8KYB",
name: "room 1",
status: "FULL"
}
},
{
room: {
code: "r002",
id: "txv3vvBr8KJB",
name: "room 2",
status: "FULL"
}
},
{
room: {
code: "r003",
id: "txv3vvBr8LKP",
name: "room 3",
status: "FULL"
}
}
];
const ids = roomList.reduce((a, {room: {id}}) => (a.add(id), a), new Set());
const result = data.filter(({id}) => !ids.has(id));
console.info(result);
В качестве альтернативы, если вы действительно хотите сделать это в одну строку и производительность не такая уж большая проблема, вы можете использовать some():
const result = data.filter(({id}) => !roomList.some(({room}) => room.id === id));
Полный фрагмент:
const data = [{
id: "txv3vvBr8KYB",
name: "room 1"
}, {
id: "txv3vvBr8KJB",
name: "room 2"
}, {
id: "txv3vvBr8K",
name: "room 4"
}, {
id: "txv3vvBr8LKP",
name: "room 3"
}, {
id: "txv3vvBr8LDS",
name: "room 5"
}];
const roomList = [{
room: {
code: "r001",
id: "txv3vvBr8KYB",
name: "room 1",
status: "FULL"
}
},
{
room: {
code: "r002",
id: "txv3vvBr8KJB",
name: "room 2",
status: "FULL"
}
},
{
room: {
code: "r003",
id: "txv3vvBr8LKP",
name: "room 3",
status: "FULL"
}
}
];
const result = data.filter(({id}) => !roomList.some(({room}) => room.id === id));
console.info(result);
this.data = this.data.filter(item => item !== data_item);
Ссылка:https://www.codegrepper.com/code-examples/javascript/remove+element+from+list+angular+8