Вы можете сделать следующее:
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'),
),
),
);