2016-03-19 12 views
1

でRamdas「propSatisfies」メソッドを使用して:私はこのようなオブジェクトの配列を持つ変数オブジェクトのキー名

array = [{ 
       name: "Object A", 
       ratio: { 
        up: 1, 
        mid: 2, 
        down: 1 
       } 
      }, 
      { 
       name: "Object B", 
       ratio: { 
        up: 3, 
        mid: 1, 
        down: 2 
       } 
      }]; 

そして、このような機能:私が好きなこの機能を

getGteLevelPerRatio = (list, keysTrue, level) => {...}; 
// "level" is of type number and can be 1,2 or 3 
// "keysTrue" is an array of type String and can be any element of the power set of ["up", "mid", "down"], eg. ["up"] or ["mid", "down"] 

"ratio"の少なくとも1つのプロパティが "keysTrue"の1つの要素と等しいすべてのオブジェクトを取得し、等しい場合、プロパティの値は "level"と等しいか+1でなければなりません。


例:

keysTrue = [ "上"、 "中"]

レベル= 2

戻り、AとオブジェクトBオブジェクト、オブジェクトAのratio.midため== = 2、オブジェクトBのratio.up === 3はレベル+1と同じです。


私はRamdaドキュメントを正しく読んでいればRamda 'propSatisfied'メソッド(参照:Ramda docs - propSatisfiedを参照)で可能でなければなりませんが、変数値で述語を使用する方法はわかりません。あなたの助けのための

getGteLevelPerRatio = (list, keysTrue, level) => { 
     arrayFiltered = []; 
      array.forEach(entry => { 
      keysTrue.forEach(keysTrueEntry => { 
       for (key in entry.ratio) { 
        if (keysTrueEntry === key) { 
         if (level <= entry.ratio[key]) || level <= entry.ratio[key]) + 1) { 
          arrayFiltered.push(entry);         
          console.log(entry.name + " " + key + ": " + entry.ratio[key]); 
         } 
        } 
       } 
      return arrayFiltered; 
} 

ありがとう:

ここRAMDAせずに私はむしろ非効率的なバージョンです!

マフ

答えて

2

次のようなものは、あなたが欲しいものを行う必要があります。

const getGteLevelPerRatio = (list, keysTrue, level) => { 
    const gteKeysFns = R.map(R.propSatisfies(R.gte(R.__, level)), keysTrue); 
    return R.filter(R.propSatisfies(R.anyPass(gteKeysFns), 'ratio'), list); 
}; 

最初の行は、それがある場合は、各キーのtrueを返します関数のリストを作成し、keysTrueリストの上にマッピングします以上与えlevel(私たちは、部分的にlevelR.gteの第二引数を適用するには、ここR.__プレースホルダを使用するNB)に等しいです。

第2行目は、ratioプロパティがgteKeysFnsリスト内の関数のいずれかを満たすものだけにオブジェクトの指定されたリストをフィルタリングします。

+0

うわー、ありがとう!私はramdaやpropSatisfies関数の仕組みを完全に理解していないと思います。どのようにして1行目に1つの引数を、2行目に2つの引数を渡すだけですか?ドキュメントでは、propSatisfiesは3つの引数を取ると言います - これはカリングによるものですか? – Raggamuffin

+0

正確に。 Ramdaのすべての関数は自動的にカリングされるので、このインスタンスでは 'propSatisfies'が部分的に適用されます。これは事実上、 'propSatisfies'の最初の呼び出しが、2つのさらなる引数(キーと比率オブジェクト)を必要とする関数をもたらし、2番目の呼び出しがただ1つのさらなる引数を必要とする関数をもたらすことを意味します(それぞれのオブジェクトは'アレイ)。 –

+0

これはとても素敵です!私はこのようなプログラミングの提案を解決する方法を思っています。 – Raggamuffin

関連する問題