2015-12-20 15 views
8

何度も私は同じ問題に直面しています。単純な条件で配列をフィルタリングしたいと思います。含まれ、より少ない、より大きく、非/平等をチェック...javascriptで簡単なフィルタ関数を作成する最も良い方法は何ですか?

私のコードは次のようになります。

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] 

か:

function isGreaterThan(value, original) { 
    return value < original; 
} 
[1, 2, 3, 4].filter(isGreaterThan.bind(null, 2)); // [3, 4] 

より良いWaがありますどのようにjavascriptでこれを行うにはy? javascriptには、これらの単純な比較をサポートするビルトイン関数がありますか?あなたは、ほとんどがあった

+1

を研ぐための基本的な構成です。 – CoderPi

+0

パフォーマンスやクリーンコードについて質問していますか? (あなたのやり方はクリーンなコードでは最高だと思いますが、パフォーマンスでは伝統的なforループが良いかもしれません)。 – caballerog

+0

質問はクリーンコードについてです – madox2

答えて

4

あなたがつまずいてきたことはcurryingの概念であるMadox、!そしてその考えの周りにentire JavaScript communityがあると聞いてうれしいです。

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

そしてit worksRamdaであなたのコードは次のようになります。

Ramdaが提供するすべての機能は、あなたが示したような「カルトヘルパー機能」のリストです。独自のヘルパー関数をカレーする場合は、curryヘルパー関数を使用して定型文を減らすことができます(var isGreaterThan = curry(function(a, b){ return a > b }))。このカレー機能は、Underscore、Lodash、Ramdaのようなほとんどのユーティリティライブラリによって提供されます。

+0

私はRamteからのgte、eq、has、...のようなヘルパー関数を正確に探していました。しかし、私はまだよく分かりません。ES6にはたくさんの機能があるので、他のライブラリを習得して使いたいのであれば、 – madox2

+0

@ madox2 [Rambdaソースコード](https://github.com/ramda/ramda)に入ったら、すぐにスケルトンを見つけることができます。 – naomik

-4

は、ここに正しいものである:

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

reference

+0

それは正しいものではありません... – epascarello

3

ここで@Avaqの答えを少し詳しく説明します。カレー化の使用を開始するには、ラムダのようなライブラリは必要ありません。今日はES6でこれをやり始めます。

あなたは既にコンセプトを理解しているようです。これはすでにカルト機能です。 ES6 arrow functions

function isGreaterThan(value) { 
    return function(original) { 
     return value < original; 
    } 
} 

を(各シーケンスされた関数は引数を1つしかかかります)、これは非常に簡単になります。

const gt = x => y => y > x; 

通知は、あなたは利用がより自然に見えるようにするあなたの機能で<にオペレータ>を裏返しか?最初にカレント関数を変更する可能性が最も低いオペランドを取り出すのは、カルト関数と共通しています。 gtでは、>を使用する方が良いと思います。その名前は関数の名前なので、代わりにオペランドを反転します。だから、私はx > yの代わりにy > xを返すと思うのです。 gt(5)は、私にはとても自然な感じの関数y => y > 5を返します。

さらに騒ぎがなければ、あなたはES5環境で動作するようにこれを必要とする場合のは、あなたが非常に簡単にbabelでそれをtranspileすることができ、それはfilter

[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; 
    }; 
}; 

そして、それに非常に精通しているはずです。学ぶべき面白いものがたくさんあります。私たちがここで議論したような問題で、あなたは次にfunction compositionについて学ぶことに興味があると思います。

は、ここで私はより良い方法があるとは思わないあなたの食欲

// 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] 
+0

私はすでにES6に精通しており、すばらしいです。とにかく、ヒントのおかげで! – madox2

関連する問題