【问题标题】:Filtering user based on permission names根据权限名称过滤用户
【发布时间】:2018-12-19 11:24:17
【问题描述】:

我有一组用户,它们具有一组权限。我想过滤掉拥有操作员权限的用户。

用户列表

[
  {
    EmailAddress: "test@test.com",
    FullName: "Test User",
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 202,
        PermissionName: "operator",
        roleName: "operator",
        roleid: 8,
      }
    ],
    UserID: 105,
  },
  {
    EmailAddress: "tested@test.com",
    FullName: "tested User",
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 205,
        PermissionName: "admin",
        roleName: "Admin",
        roleid: 5,
      }
    ],
    UserID: 101,
  },
]

我已经尝试过了,但是它并没有获得所有具有操作员权限的用户

data.filter(x => {
    for (const permission of x.Permissions) {
        return permission['PermissionName'] === 'boc-operator';
    }
});

【问题讨论】:

  • The following anser 应该会带你到那里。让我知道您尝试过什么但不起作用(您可以更新和评论您自己的问题)。提示:const hasPermission = (permissionName)=>(item) => item.Permissions.some(permission=>permission.PermissionName===permissionName)
  • 我已经用我尝试过的方法更新了问题

标签: javascript angular typescript filter


【解决方案1】:

您可以执行以下操作:

const data = [
  {
    EmailAddress: 'test@test.com',
    FullName: 'Test User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 202,
        PermissionName: 'operator',
        roleName: 'operator',
        roleid: 8,
      },
    ],
    UserID: 105,
  },
  {
    EmailAddress: 'tested@test.com',
    FullName: 'tested User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 205,
        PermissionName: 'admin',
        roleName: 'Admin',
        roleid: 5,
      },
    ],
    UserID: 101,
  },
];
const hasPermission = (permissionName) => (item) =>
  item.Permissions.some(
    (permission) =>
      permission.PermissionName === permissionName,
  );
console.log(data.filter(hasPermission('admin')))

如果您想过滤多个字段,您可以轻松扩展此功能:

const data = [
  {
    EmailAddress: 'test@test.com',
    FullName: 'Test User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 202,
        PermissionName: 'operator',
        roleName: 'operator',
        roleid: 8,
      },
    ],
    UserID: 105,
  },
  {
    EmailAddress: 'tested@test.com',
    FullName: 'tested User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 205,
        PermissionName: 'admin',
        roleName: 'Admin',
        roleid: 5,
      },
    ],
    UserID: 101,
  },
];
const hasPermission = (permissionName) => (item) =>
  item.Permissions.some(
    (permission) =>
      permission.PermissionName === permissionName,
  );
const emailContains = (value) => (item) =>
  item.EmailAddress.includes(value);
const createFilter = (...filterFunctions) => (item) =>
  filterFunctions.reduce(
    (result, fn) => result && fn(item),
    true,
  );
console.log(
  data.filter(
    createFilter(
      hasPermission('admin'),
      emailContains('tested'),
    ),
  )
);

最后;从对象获取属性的示例在它自己的函数中。现在你有了只实现一件事并且可以以多种方式重复使用的函数:

const data = [
  {
    EmailAddress: 'test@test.com',
    FullName: 'Test User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 202,
        PermissionName: 'operator',
        roleName: 'operator',
        roleid: 8,
      },
    ],
    UserID: 105,
  },
  {
    EmailAddress: 'tested@test.com',
    FullName: 'tested User',
    Permissions: [
      {
        PermissionData: null,
        PermissionID: 205,
        PermissionName: 'admin',
        roleName: 'Admin',
        roleid: 5,
      },
    ],
    UserID: 101,
  },
];
const getPermissions = (item) => item.Permissions;
const getPermissionName = (item) => item.PermissionName;
const getEmailAddress = (item) => item.EmailAddress;
const isIn = (comparer, getter) => (value) => (item) =>
  getter(item).some(comparer(value));
const isSame = (getter) => (value) => (item) =>
  getter(item) === value;
const contains = (getter) => (value) => (item) =>
  getter(item).includes(value);
const hasPermission = isIn(
  isSame(getPermissionName),
  getPermissions,
);
const emailContains = contains(getEmailAddress);
const createFilter = (...filterFunctions) => (item) =>
  filterFunctions.reduce(
    (result, fn) => result && fn(item),
    true,
  );
console.log(
  data.filter(
    createFilter(
      hasPermission('admin'),
      emailContains('tested'),
    ),
  ),
);

【讨论】:

    【解决方案2】:

    您可以使用 filtersome api 之类的东西

    var data=[
      {
        EmailAddress: "test@test.com",
        FullName: "Test User",
        Permissions: [
          {
            PermissionData: null,
            PermissionID: 202,
            PermissionName: "operator",
            roleName: "operator",
            roleid: 8,
          }
        ],
        UserID: 105,
      },
      {
        EmailAddress: "tested@test.com",
        FullName: "tested User",
        Permissions: [
          {
            PermissionData: null,
            PermissionID: 205,
            PermissionName: "admin",
            roleName: "Admin",
            roleid: 5,
          }
        ],
        UserID: 101,
      },
    ]
    
    var opratorUsers=data.filter(u=> u.Permissions && u.Permissions.some(p=> p.roleName=='operator'));
    
    console.log(opratorUsers);

    【讨论】:

      猜你喜欢
      • 2014-06-25
      • 2012-08-08
      • 2019-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2018-04-29
      • 2013-11-22
      • 2022-08-03
      相关资源
      最近更新 更多