【问题标题】:How can I use more than one function to filter an array in javascript?如何使用多个函数来过滤 javascript 中的数组?
【发布时间】:2020-07-01 15:38:22
【问题描述】:

我想在 generalFilter 中使用 filter1 和 filter2 函数,但我无法理解在 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));
};

这是大约。我正在尝试做的事情,但我无法成功,而且我不喜欢我的逻辑。有没有办法正确地做到这一点?

【问题讨论】:

  • array.filter(func1).filter(func2)

标签: javascript arrays ecmascript-6 filter es6-promise


【解决方案1】:

您可以像这样链接多个 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);

【讨论】:

  • 这些函数会进行实际过滤,因此将它们作为回调传递给.filter 是没有意义的。
  • @Andy 我在点击答案后才意识到并编辑了我的答案
【解决方案2】:

它们是否是两个不同的过滤器,您一次只能在参数本身上应用一个,所以我认为您应该将一个应用到另一个:

const filterGeneral = array => filter1(filter2(array));

【讨论】:

  • 我可能会先过滤filter1 然后 filter2
【解决方案3】:

您可以使用 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);

【讨论】:

  • 非常有趣的方法,为什么(如果是的话)这比仅仅链接多个过滤器函数更好?
  • 它适用于任何类型,因为它独立于数组的原型函数。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2021-08-25
  • 2020-08-09
  • 2021-09-07
  • 2017-12-18
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多