我将使用 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]