将数组与条件进行比较,并检查它们的长度是否相同

时间:2020-06-17 10:29:47

标签: javascript arrays

我正在尝试比较2个对象数组,并检查1个数组是否具有与另一个数组相同的idrole所有元素。数组如下所示:

const allUsers = [
 { id: 1, roleId: 123, username: 'User1', roles:['admin'] }
 { id: 2, roleId: 123, username: 'User2', roles:['admin'] }
 { id: 3, roleId: 123, username: 'User3', roles:['admin'] }
 { id: 4, roleId: 123, username: 'User4', roles:['admin'] }
 { id: 5, roleId: 233, username: 'User5', roles:['admin'] }
]
// first example - here I have to return false
const selectedUsers = [
 { id: 1, roleId: 123, username: 'User1', roles:['admin'] }
 { id: 2, roleId: 123, username: 'User2', roles:['admin'] }
 { id: 5, roleId: 233, username: 'User5', roles:['admin'] }
]
// 2nd example - here I can return true
const selectedUsers = [
 { id: 1, roleId: 123, username: 'User1', roles:['admin'] }
 { id: 2, roleId: 123, username: 'User2', roles:['admin'] }
]

我需要执行以下操作-在selectedUsers中,我已经选择了roleId: 233roles:['admin']的所有用户,因此我需要将一些标志设置为false。如果我没有该用户,如果我只有{1/2}的用户roleId: 123,则可以删除它们,因为有更多具有相同RoleId和roles: ['admin']的用户。

我需要以某种方式比较这些数组,并检查是否尝试删除所有具有相同roleIdrole的用户。

关于什么是最简单的解决方案的任何提示?

编辑:正如我在评论中所写,我正在尝试检查是否可以删除selectedUsers,但是只有在至少有1个具有相同roleId和'admin的不同用户的情况下,我才能这样做在allUsers数组中

1 个答案:

答案 0 :(得分:1)

您可以在函数中返回它:

return selectedUsers.every(u => 
    allUsers.filter(a =>
        a.roleId === u.roleId && a.roles.join('') === u.roles.join(''))
            .length > 1);
  • every()确保每个selectedUser都满足条件
  • 正在filter()中测试该条件,以确保您需要至少有2个相似的用户,且他们与被检查的用户具有相同的roleIdroles。请注意,它是2而不是1,因为allUsers当前还包括被检查的用户,在您从此函数返回true后,该用户可能会被删除。
  • 注意:join()技巧对两个roles数组(不能仅检查u.roles == a.roles)进行简单的深度相等比较,前提是角色应该以一致的方式列出顺序(如果有多个角色)。