2017-08-21 28 views
0

を使用して複数のパスにフィルタリングする方法I以下の擬似コードを持っている:それは、配列を3回反復するため関数型プログラミング

let array = getData(); 
array.filter(x => condition1(x)).doSomething1... 
array.filter(x => condition2(x)).doSomething2... 
array.filter(x => condition3(x)).doSomething3... 

は明らかに、これは効率的ではありません。配列は一度だけ繰り返されますようにするため

array.filterMany([ 
    x => condition1(x).doSomething1..., 
    x => condition2(x).doSomething2..., 
    x => condition3(x).doSomething3... 
]) 

:私のような何かをする方法があるかどう

私は思っていましたか?

+1

もっと明確な例がありますか? –

+0

配列reduceを使用します。 – Neal

+2

論理的な "と" && "を使うことができませんでしたか? – clabe45

答えて

0

アレイリダクション機能を使用できます。例えば

const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; 
 
    
 
    const split = arr.reduce(([odd, even], current) => { 
 
     if (current % 2 === 0) { 
 
      even.push(current); 
 
     } else { 
 
      odd.push(current); 
 
     } 
 
    
 
     return [odd, even]; 
 
    }, [[], []]); 
 
    
 
    console.log('Odd/Even', split);

+0

ありがとうございます。私は7分以内にしかできません – MotKohn

+0

@MotKohn :-)助けて幸い – Neal

+1

同じ値が複数の条件を満たす可能性がある場合は、その 'if/else'を' if'sの系列に変えてください! – shabs

1

どのようにこのようなものでしょうか?

const condition1 = x => x === 1; 
 
const condition2 = x => x === 2; 
 
const condition3 = x => x === 3; 
 

 
[1, 2, 3].map(n => { 
 
    condition1(n) && console.log('foo'); 
 
    condition2(n) && console.log('bar'); 
 
    condition3(n) && console.log('baz'); 
 
})

+0

'.map'機能は何を期待していますか? – Neal

+0

@Nealだけの 'forEach'!多分もっと意味論的に正確だったでしょう。 – shabs

1

あなたは配列に条件を取り、Array#everyとに対してチェックすることができます。

var conditions = [condition1, condition2, condition3], 
    filtered = array.filter(a => conditions.every(c => c(a))); 
関連する問題