Динамический фильтр: создание динамического фильтра с использованием .filter () - PullRequest
3 голосов
/ 09 марта 2019

let users = [
    { id: 11, name: 'Adam', age: 23, group: 'editor' },
    { id: 47, name: 'John', age: 28, group: 'admin' },
    { id: 85, name: 'William', age: 34, group: 'editor' },
    { id: 97, name: 'Oliver', age: 28, group: 'admin' }
  ];

var getFilteredUsers = (array, key, value) => array.filter(x => x[key] === value);
var FilteredUsers = getFilteredUsers(users, "age", 28);
console.log(FilteredUsers);

Я пытаюсь создать динамический фильтр, основанный на key:value, переданном в getgetFilteredUsers(), который даст соответствующий вывод.

Прямо сейчас,getgetFilteredUsers() только вычисляет equals to.Но я хочу использовать эту же функцию для сравнения всех трех сравнений, т. Е. Равно, меньше и больше, чем.

Ответы [ 3 ]

5 голосов
/ 09 марта 2019

Альтернативой является передача предиката, который будет вызываться функцией filter

let users = [{ id: 11, name: 'Adam', age: 23, group: 'editor' },{ id: 47, name: 'John', age: 28, group: 'admin' },{ id: 85, name: 'William', age: 34, group: 'editor' },{ id: 97, name: 'Oliver', age: 28, group: 'admin' }];
let getFilteredUsers = (array, handler) => array.filter(handler);

let  FilteredUsers = getFilteredUsers(users, x => x['age'] === 28);
console.log(FilteredUsers);

FilteredUsers = getFilteredUsers(users, x => x['age'] > 28);
console.log(FilteredUsers);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 09 марта 2019

Вы можете использовать объект для хранения ваших операций и индексировать этот объект, чтобы получить правильную функцию для применения к этой операции:

const users = [
  { id: 11, name: 'Adam', age: 23, group: 'editor' },
  { id: 47, name: 'John', age: 28, group: 'admin' },
  { id: 85, name: 'William', age: 34, group: 'editor' },
  { id: 97, name: 'Oliver', age: 28, group: 'admin' }
];

const filterUsers = (arr, key, value, op = 'eq') => {
  const ops = {
    eq: (x, y) => x === y,
    lt: (x, y) => x < y,
    gt: (x, y) => x > y
  };
  return arr.filter(x => ops[op](x[key], value));
};

console.log(filterUsers(users, 'age', 28));
console.log(filterUsers(users, 'age', 28, 'lt'));
console.log(filterUsers(users, 'age', 28, 'gt'));
1 голос
/ 09 марта 2019

Вы можете взять функции для сравнения и передать требуемую или взять equal сравнение как значение по умолчанию.

const
    equal = (a, b) => a === b,
    lt = (a, b) => a < b,
    gt = (a, b) => a > b,
    filter = (array, key, value, cf = equal) => array.filter(x => cf(x[key], value));

var users = [{ id: 11, name: 'Adam', age: 23, group: 'editor' }, { id: 47, name: 'John', age: 28, group: 'admin' }, { id: 85, name: 'William', age: 34, group: 'editor' }, { id: 97, name: 'Oliver', age: 28, group: 'admin' }],
    user28 = filter(users, "age", 28),
    userLT28 = filter(users, "age", 28, lt);

console.log(user28);
console.log(userLT28);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...