如何从列表中过滤数据并以角度从数据中删除现有房间

ABC*_*ABC 4 javascript typescript angular

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"
      }
    }
]
Run Code Online (Sandbox Code Playgroud)

我在这里尝试做的是过滤 roomList 中的数据,并在它们是相同的 id 时从数据中删除项目。

预期的输出应该是这样的:

data = [{
     id: "txv3vvBr8K",
     name: "room 4"
    }{
     id: "txv3vvBr8LDS",
     name: "room 5"
    }]
Run Code Online (Sandbox Code Playgroud)

我尝试使用过滤器和地图。

this.data.filter((x: any) => this.roomList.map((y: any) => y['room']['id] === x['id']);
Run Code Online (Sandbox Code Playgroud)

Rob*_*sen 5

可能最好首先reduce()将房间 ID 设置为 a Set,然后filter()基于此:

const ids = roomList.reduce((a, {room: {id}}) => (a.add(id), a), new Set());
const result = data.filter(({id}) => !ids.has(id));
Run Code Online (Sandbox Code Playgroud)

完整片段:

const ids = roomList.reduce((a, {room: {id}}) => (a.add(id), a), new Set());
const result = data.filter(({id}) => !ids.has(id));
Run Code Online (Sandbox Code Playgroud)


或者,如果您真的想以单线方式完成并且性能不是那么大的问题,您可以使用some()

const result = data.filter(({id}) => !roomList.some(({room}) => room.id === id));
Run Code Online (Sandbox Code Playgroud)

完整片段:

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.log(result);
Run Code Online (Sandbox Code Playgroud)