在JS中反转[] .filter?

use*_*725 36 javascript arrays filter

我意识到我能做到:

arr = arr.filter(function(n){ return !filterFunc(n); });
Run Code Online (Sandbox Code Playgroud)

但有没有办法只是反转一个过滤器而不将过滤器包装在一个匿名函数中?

这看起来很麻烦.

aps*_*nce 23

您可以使用箭头功能:

const a = someArr.filter(someFilter);
const a = someArr.filter(e => !someFilter(e));
Run Code Online (Sandbox Code Playgroud)


Sas*_*cha 21

Lodash提供了一个与过滤器完全相反的拒绝函数。

arr = _.reject(arr, filterFunc);
Run Code Online (Sandbox Code Playgroud)

  • 我来这里是因为我忘记了 _.filter 的逆函数是如何调用的。谢谢你! (3认同)

sud*_*dee 6

看看 lodash 的negate函数。它完全符合@Yury Tarabanko在他的评论中提到的内容。

用法:

arr = arr.filter(_.negate(filterFunc));
Run Code Online (Sandbox Code Playgroud)

  • 对于lodash,你最好使用`_.reject`:_与_.filter相反;此方法返回谓词不返回 true 的集合元素。_ https://lodash.com/docs/#reject (4认同)

SEo*_*EoF 5

我对任何答案都不满意,实际上最终使用了更新的 JS 功能

arr.filter(() => ! filterfunc(...arguments));
Run Code Online (Sandbox Code Playgroud)

这击败了大多数其他方法,因为无需使用箭头函数this在任何时候重新指定上下文 () ,并使用参数对象上的扩展语法相应地传递所有参数相应地传递所有参数。

它也相当简洁,尽管我更愿意在过滤器函数或单独的函数上使用反转标志。

这个问题可能有点老套,但仍然具有现实意义。


Jam*_*Lai 1

filtertrue返回在您的评估中返回的元素。如果您想反转它,请在测试每个元素的函数中反转您的逻辑。

然后,你可以简单地让这个函数像这样工作:

arr = arr.filter(filterFunc);