Как я могу использовать более одной функции для фильтрации массива в javascript? - PullRequest
1 голос
/ 20 марта 2020

Я хочу использовать функции filter1 и filter2 в общемFilter, но я не могу понять правильный синтаксис, чтобы сделать это в Javascript.

const filter1 = (
  array
) => {

  return array.filter((parameter, index) => {
    return (
      !parameter.isOptional()
    );
  });
};

const filter2 = (
  array
) => {

  return array.filter((parameter, index) => {
    return (
      !parameter.isEmpty()
    );
  });
};

const filterGeneral = (
  array
) => {
  return array.filter(filter1(array) && filter2(array));
};

Это ок. что я пытаюсь сделать, но мне не удается добиться успеха, и мне не нравятся мои логи c. Есть ли способ сделать это правильно?

Ответы [ 3 ]

4 голосов
/ 20 марта 2020

Вы можете использовать функцию pipe , где вы берете некоторую функцию и берете результат из первой функции в качестве входа для второй функции и т. Д.

const
    pipe = (...functions) => input => functions.reduce((acc, fn) => fn(acc), input),
    filter1 = array => array.filter((parameter, index) => !parameter.isOptional()),
    filter2 = array => array.filter((parameter, index) => !parameter.isEmpty()),
    filterGeneral = pipe(filter1, filter2),
    array = [{ ... }, { ... }],
    result = filterGeneral(array);
2 голосов
/ 20 марта 2020

Имеют ли они два разных фильтра, вы можете применять только один за раз к самому параметру, поэтому я думаю, что вы должны применять один к другому:

const filterGeneral = array => filter1(filter2(array));
1 голос
/ 20 марта 2020

Вы можете просто объединить несколько методов filter() следующим образом:

const array = [1, 2, 3, 4, 5];

array.filter((elem) => elem > 2).filter((elem) => elem > 3);
// returns [4, 5]

Это работает, потому что Array.prototype.filter () возвращает отфильтрованный массив. Вы можете просто снова отфильтровать этот массив.

Это означает, что приведенный выше пример аналогичен написанию этого:

const array = [1, 2, 3, 4, 5]
const tmp = array.filter((elem) => elem > 2);
tmp.filter((elem) => elem > 3);
...