如何对比对象数组与嵌套数组并找出两者差异?
过滤出未加入任何群组的用户
你的代码之所以返回所有用户,核心问题是错误地将用户ID字符串与整个members数组做全等比较(user.userId === group.members),字符串和数组永远不可能全等,因此groups.some(...)始终返回false,取反后!false为true,最终所有用户都被保留。
修复方案一:直接修改原逻辑
只需要把判断条件改成检查用户ID是否存在于群组的members数组中,使用Array.includes()方法即可:
const userWithNoGroup = users.filter((user) => { return !groups.some((group) => { return group.members.includes(user.userId); }); });
优化方案二:先收集所有群组成员ID(适合大数据量)
如果你的groups或users数组规模较大,先一次性提取所有已加入群组的用户ID,再做过滤会更高效:
// 提取所有群组中的成员ID,flatMap自动展开嵌套数组 const allGroupMemberIds = groups.flatMap(group => group.members); // 过滤出不在成员ID列表中的用户 const userWithNoGroup = users.filter(user => !allGroupMemberIds.includes(user.userId));
两种方案最终都会得到你想要的结果:
[{ name: "John", userId: "2" }]
内容的提问来源于stack exchange,提问作者Navih
相关产品推荐
相关产品推荐

