我正在尝试创建一个仅包含其他数组中未包含的值的数组(非重复)



我有一个可以被邀请的可用用户数组,还有一个包含所有加入到特定聊天的用户的数组。我需要检查哪些可用的用户已经加入了聊天,应该在其他地方列出。

最后,我想获得一个数组,其中只有未加入聊天的可用用户。

let availablеUsers = [{id:1,name:'Dani'}, {id:2,name:'Ani'}, {id:3,name:'Marta'}] 
let allUsers = [{id:2,name:'Ani'},{id:10,name:'John'}, {id:3,name:'Marta'}] 

我试着做的第一件事是找到那些已经参与聊天的人:

let joinedUsers = availablеUsers.map((user) => {
return allUsers?.find((u) => u.id === user.id);
});

,我得到这个:(未定义,{…А倪},{……玛尔塔}]

然后我尝试过滤可用用户的数组以便从中删除新创建的数组中的用户问题是,我不知道该怎么做/

我的想法是这样的:

availablеUsers = availablеUsers.filter((user) => {
//HERE I don't know what logic to write 
return joinedUsers?.map((m) => m?.id !== user.id); // this doesn't work, just an example
});

我的目标是在availableUsers数组中只保留那些不包含在另一个数组中的用户。

在我最后给出的例子中,数组应该只保留{id:1,name:'Dani'}

我欢迎任何建议。如果它可以通过链接来实现,而不需要joinedUsers的额外变量,那就更好了!

不需要joinedUsers。在filter()回调中只使用find()some(),并进行反试。

availableUsers = availableUsers.filter(user => !allUsers.some(u => u.id == user.id))

如果用户是由id唯一标识的,您可以只使用一个过滤器,设置已知用户的:

let availablеUsers = [{id:1,name:'Dani'}, {id:2,name:'Ani'}, {id:3,name:'Marta'}] 
let allUsers = [{id:2,name:'Ani'},{id:10,name:'John'}, {id:3,name:'Marta'}]
let joinedUsers = availablеUsers.filter(
function ({id}) {
return this.has(id);
},
new Set(allUsers.map(({id}) => id))
);

相应地,您可以使用相同的方法一次性更新availablеUsers:

availablеUsers = availablеUsers.filter(
function ({id}) {
return !this.has(id);
},
new Set(allUsers.map(({id}) => id))
);

它不是超级清楚为什么或何时你需要!=====,但概念是:使用一个集合,使用filter而不是map,当你想要过滤+一个集合的工作更困难,而通过has()使用时,它是非常快的

最新更新