Фильтрация пользователей на основе имен разрешений - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть массив пользователей, у которых есть массив разрешений.Я хочу отфильтровать пользователей, которые имеют разрешение оператора.

Список пользователей

[
  {
    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';
    }
});

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Вы можете сделать следующее:

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'),
    ),
  ),
);
0 голосов
/ 19 декабря 2018

Вы можете использовать filter и некоторые 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);
...