在javascript中创建简单过滤函数的最佳方法是什么?

在javascript中创建简单过滤函数的最佳方法是什么?,javascript,arrays,functional-programming,Javascript,Arrays,Functional Programming,很多时候,我都会遇到同样的问题:我想用一个简单的条件筛选数组,例如检查非/相等、大于、小于、包含 我的代码如下所示: var result = [1, 2, 3, 4].filter(function(i) { return i > 2; }); console.log(result); // [3, 4] 能有这么简单的操作的快捷方式真是太好了 我创建了一些助手函数: function isGreaterThan(value) { return function(ori

很多时候,我都会遇到同样的问题:我想用一个简单的条件筛选数组,例如检查非/相等、大于、小于、包含

我的代码如下所示:

var result = [1, 2, 3, 4].filter(function(i) {
   return i > 2; 
});
console.log(result); // [3, 4]
能有这么简单的操作的快捷方式真是太好了 我创建了一些助手函数:

function isGreaterThan(value) {
    return function(original) {
        return value < original;
    }
}
[1, 2, 3, 4].filter(isGreaterThan(2)); // [3, 4]
函数大于(值){
返回函数(原始){
返回值<原始值;
}
}
[1,2,3,4]。筛选器(大于(2));//[3, 4]
或:

函数大于(值,原始){
返回值<原始值;
}
[1,2,3,4]。筛选器(isGreaterThan.bind(null,2));//[3, 4]

有没有更好的方法在javascript中实现这一点?javascript是否有任何内置函数来支持这些简单的比较?

您几乎做到了,下面是正确的一个:

var original = 2;
function isGreaterThan(value) {
    return value > original;
}
var result = [1, 2, 3, 4].filter(isGreaterThan);
// result is [3, 4]

马多克斯,你偶然发现的是一个概念!你会很高兴听到有一个围绕着这个想法建立起来的想法。您的代码如下所示:

var filterSmallNumbers = filter(gte(3));
var smallNumbers = filterSmallNumbers([1,2,3,4,5,6]);


Ramda提供的只是一个“curried helper函数”列表,如您所示。如果您更愿意使用自己的助手函数,那么您可能需要一个
curry
helper函数,它简化了样板:
var isGreaterThan=curry(函数(a,b){returna>b})
。大多数实用程序库(如下划线、Lodash或Ramda)都提供了这个curry函数。

我将在这里对@Avaq的答案进行一点扩展。你不需要像Rambda这样的库来开始使用咖喱。您可以从今天开始使用ES6执行此操作

看来你已经理解了这里的概念。这已经是一个常用的函数了。(每个序列函数只接受一个参数)

注意您是如何在函数中将操作符
翻转为
以使用法看起来更自然的?在curried函数中,首先获取最不可能更改的操作数是很常见的。使用codegt/code时,我认为最好在这里使用code>,因为这是我们函数的名称,而是翻转操作数。这就是为什么你看到我返回
y>x
,而不是
x>y
gt(5)
返回一个函数
y=>y>5
,我觉得这很自然

不用多说,让我们看看它在
过滤器中的工作情况

[1,2,3,4,5,6].filter(gt(3)); //=> [4,5,6]
如果您需要在ES5环境中使用它,您可以非常轻松地使用它进行传输。结果应该很熟悉

"use strict";
var gt = function gt(x) {
    return function (y) {
        return y > x;
    };
};

有了这些,你就站在了函数式编程的门口。有很多有趣的东西要学。对于我们在这里讨论的这类问题,我想你们会有兴趣了解下一个问题

这里有一个基本的成分来刺激你的食欲

// filter out odd numbers
const mod = x => y => y % x;
const eq = x => y => y === x;
const comp = f => g => x => f(g(x));
const isEven = comp (eq (0)) (mod (2));
[1,2,3,4,5,6].filter(isEven); //=> [2,4,6]

我认为没有更好的方法了。你是在问性能还是干净的代码?(我认为您的方式在干净代码方面是最好的,但在性能方面,传统的for循环可能会更好)!如果函数的问题将得到解决汉克斯,我正是在寻找像gte,eq,has。。。来自拉姆达。但我仍然不确定我是否想学习和使用其他库,因为ES6有很多它的功能。@madox2一旦你开始深入研究,你就会立即发现骨架。我已经熟悉ES6了,它很酷。无论如何,谢谢你的提示!
[1,2,3,4,5,6].filter(gt(3)); //=> [4,5,6]
"use strict";
var gt = function gt(x) {
    return function (y) {
        return y > x;
    };
};
// filter out odd numbers
const mod = x => y => y % x;
const eq = x => y => y === x;
const comp = f => g => x => f(g(x));
const isEven = comp (eq (0)) (mod (2));
[1,2,3,4,5,6].filter(isEven); //=> [2,4,6]