2017-09-11 15 views
1

Ramada.jsのtransduceを使用して、最適化のために中間変換((2xフィルタリング、1xソート)なし)を使用するにはどうすればよいですか?今の最適化のためにJavaScriptで変換を使用する

import { curry, tap, pipe, filter, propEq, sortBy, prop } from 'ramda' 

//const debugLog = curry((prefix, data) => console.log('@', prefix, data)) 

const func = (data, name) => 
    pipe(

    //tap(debugLog('pipe')), 

    prop('tasks'), 

    //tap(debugLog('prop')), 

    filter(propEq('username', name)), 
    filter(propEq('complete', false)), 
    sortBy(prop('dueDate')) 
)(data) 

export default func 

私はそのようなものを見つけましたが、それでも私は自分のソリューションにそれを実装に問題があります。

var numbers = R.range(0, 1000000) 
var transducer = R.pipe(
    R.map(R.add(1)), 
    R.map(R.multiply(2)), 
    R.filter(x => x % 2 === 0) 
) 

R.transduce(transducer, R.add, [], numbers) 
+4

私はSORTBYがドキュメントを追加する傾向がある(トランスデューサで使用することができ、「トランスがリスト位置に指定されている場合、トランスデューサとして行為。」を信じていませんそれ以外の場合は、2つのフィルタ間の中間データ構造を削除する最も簡単な方法は、predicate - > filter(propEq( 'username'、name)、propEq( 'complete'、false))と –

+1

合意されたトランスデューサでは、個々の要素の操作を組み合わせることができますが、ソートはより大きなデータ構造にわたって動作します。最初のものをソートしてから2番目のものをソートすることができます。 –

答えて

2

const func = (data, name) => 
 
    R.sortBy(R.prop('dueDate'), R.transduce(R.compose(
 
      R.filter(R.propEq('username', name)), 
 
      R.filter(R.propEq('complete', false)) 
 
     ), R.flip(R.append), [], data.tasks))

関連する問題