我将使用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
来实现这一目标吗?
答案 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)
我们可以重用
isBigEnough
来实现这一目标吗?
是的,通过稍微修改您的代码,我们甚至可以使用相同的过滤方法返回 false值。
function isBigEnough(value) {
return value >= 10;
}
var filterFalse = [12, 5, 8, 130, 44].filter(x => !isBigEnough(x));
// filterFalse - [5, 8]