2016-03-20 7 views
1

すべてのインスタンスのインデックスを検索しようとしています。HeaderFooterを配列に入れてみましょう。array(Ramda.js way)内の要素のすべての出現のインデックスを見つける方法は?

var arr = [ 
'data', 
'data', 
'data', 
'data', 
'Header', 
'data', 
'data', 
'data', 
'Footer', 
'data', 
'Header', 
'data', 
'Footer', 
'data' 
]; 

私は無地のJS(How to find index of all occurrences of element in array?)でこれを行う方法を知って、私はそれが特にFP、ramda.jsで行われるだろうか疑問に思いますか?

私は、最初のインスタンスR.findIndex(R.test(_regexForHeader))のためにこれを行う方法を知っているが、すべての配列をループのまわりで私の頭をラップすることはできません。手伝ってくれてありがとう。

答えて

3

は、リストを反復処理しながら、インデックスへのアクセスを必要とするときに、そのインデックスと一緒にリストアップジップ一般的だろうつまりという点にあります。 Ramdaは、mapのような関数を変更するためのR.addIndex関数を提供し、反復中に各要素と共にインデックスを提供します。

彼の例では、ネストはまた、組成物のパイプラインに置き換えることができますが好む場合:

const zipWithIndex = addIndex(map)(pair); 

const isHeaderOrFooter = either(equals('Header'), equals('Footer')); 

const hfIndices = pipe(
    zipWithIndex, 
    filter(pipe(head, isHeaderOrFooter)), 
    map(nth(1)) 
); 

hfIndices(arr); 

ことの一つは、あなたがリストの複数の繰り返し処理を行う羽目になるされ、これらのアプローチの両方での留意します回。これは通常、小さなリストでは問題にはなりませんが、大きなリストの場合は、R.intoを使用してマップとフィルタを効果的に融合させてトランスデューサに統合します(http://simplectic.com/blog/2015/ramda-transducers-logs/トランスデューサの優れた紹介)。

これはcomposepipeから組成物をスワップ(トランスデューサ機能が逆の順序で構成)とintoとそれを包むことによって、上記の例でhfIndicesに小さな微調整を達成することができます。

const hfIndices = into([], compose(
    zipWithIndex, 
    filter(pipe(head, isHeaderOrFooter)), 
    map(nth(1)) 
)); 
0

私はそれがFPにはありませんが、私はあなたが作業したいデータを "生成"しなければならないと思います。あなたはその後、あなたのフィルタを適用するためのインデックスを追加する必要があります。

var arr = ['data', 'data', 'data', 'data', 'Header', 'data', 'data', 'data', 'Footer', 'data', 'Header', 'data', 'Footer', 'data']; 

R.map((e) => e[1], 
    R.filter(val => val[0] == 'Header' || val[0] == 'Footer', 
    R.addIndex(R.map)((e, i) => [e,i], arr) 
) 
); 
// => [4, 8, 10, 12] 

これは最も精巧なソリューションではありませんが、それはあなたが行くを取得する必要があります! pierrebeitzの答え@

関連する問題