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

时间:2017-01-11 15:59:41

标签: javascript arrays functional-programming

我将使用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来实现这一目标吗?

5 个答案:

答案 0 :(得分:2)

您可以创建一个返回函数反转形式的函数:



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);




答案 1 :(得分:1)

否定谓词:



function isBigEnough(value) {
  return value >= 10;
}

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

console.log(filtered);




答案 2 :(得分:0)

您可以使用包装器来表示非功能。

function isBigEnough(value) {
    return value >= 10;
}

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

答案 3 :(得分:0)

虽然现有的答案是正确的,但这里有一点不同:

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库进行构图和曲线处理。

答案 4 :(得分:0)

  • 我现在看到这只是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]