让 Array.filter() 返回 false 而不是 true 的项目



我将使用 MDN Array.prototype.filter() 文档中的示例。

我们可以将解耦函数传递到高阶函数中,如下所示:

function isBigEnough(value) {
  return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough);
// filtered is [12, 130, 44]

使用上面的例子作为参考,是否可以在不定义另一个解耦函数isSmallEnough()的情况下过滤"不够大"的结果?换句话说,我们想返回[5, 8].

我们可以重用isBigEnough来实现这一点吗?

您可以创建一个返回函数倒置形式的函数:

function not(predicate) {
  return function() {
    return !predicate.apply(this, arguments);
  };
}
function isBigEnough(value) {
  return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(not(isBigEnough));
console.log(filtered);

否定谓词:

function isBigEnough(value) {
  return value >= 10;
}
var filtered = [12, 5, 8, 130, 44].filter(function(value) {
  return !isBigEnough(value);
});
console.log(filtered);

尽管现有的答案是正确的,但这里有一个略有不同的看法:

let not = x => !x;
let greaterThan = R.curryN(2, (x, y) => y > x);
let greaterThan10 = greaterThan(10); // === isBigEnough
let notGreaterThan10 = R.pipe(greaterThan10, not);
let items = list.filter(notGreaterThan10);

使用 ramda.js 库进行合成和咖喱。

你可以对 not 函数使用包装器。

function isBigEnough(value) {
    return value >= 10;
}
var not = fn => (...args) => !fn(...args),
    filtered = [12, 5, 8, 130, 44].filter(not(isBigEnough));
console.log(filtered);

  • 我现在看到这只是 On Dron 答案的 ES6 变体。很确定他是对的,因为这会满足测试问题。

    我们可以重用isBigEnough来实现这一点吗?

是的,通过稍微修改您的代码,我们甚至可以使用相同的过滤器方法来仅返回 false 值

function isBigEnough(value) {
  return value >= 10;
}
var filterFalse = [12, 5, 8, 130, 44].filter(x => !isBigEnough(x));
// filterFalse - [5, 8]

相关内容

最新更新