2016-12-13 6 views
0

を使用して置き換える私はRAMDAに探していますとtの質問があり、次のようRamda REPLから:検索と機能JavaScriptとRAMDA

const R = require('ramda') 
//const original = require('./test/fixtures/original.json') 
const original = { 
    speakers: { 
    name: 'Author', 
    words: [ 
     { duration: '0.360000', name: 'Arthur', time: '0.660000', paragraph: 'p0-0' }, 
     { duration: '0.150000', name: 'the', time: '1.020000', paragraph: 'p0-0' }, 
     { duration: '0.380000', name: 'rat', time: '1.170000', paragraph: 'p0-0' }, 
     { duration: '0.770000', name: '.',  time: '1.550000', paragraph: 'p0-0' }, 
     { duration: '0.360000', name: 'Arthur', time: '89.820000', paragraph: 'p1-0' }, 
     { duration: '0.390000', name: 'stood', time: '90.180000', paragraph: 'p1-0' }, 
     { duration: '0.090000', name: 'and', time: '90.570000', paragraph: 'p1-0' } 
    ] 
    } 
} 

const words = R.lensPath(['speakers', 'words']) 
const wordsList = R.view(words, original) 
const result = [...wordsList.reduce((hash, { duration, time, name, paragraph }) => { 
    const current = hash.get(paragraph) || { paragraph, words: [] }; 

    current.words.push({ duration, time, name }); 

    return hash.set(paragraph, current); 
}, new Map).values()]; 

console.log(result); 

どのように私はそれが代わりに上記のパラグラフごとにグループ化され得るためにgroupByを使用します方法?

この結果から、すべての単語を時間順にソートし、一致する段落のみを返すことで、1つ以上のアイテムを持つことができる文字列の検索を行うにはどうすればよいですか?

search_criteria = 'Arthur stood'; 

results = [ 
    { para: 'p1-0', 
    words: [ 
     { 'name': 'Arthur', 'time': 89.820000}, 
     { 'name': 'stood', 'time': 90.180000} 
    } 
] 

どのようにこれらのアイテムをreplace = 'Arthuro stopped'に置き換えますか?

何かアドバイスをいただければ幸いです。 RAMDAであなたの最初の問題を解決するために

答えて

1

一つの方法は次のようになります:

pipe(
    view(lensPath(['speakers', 'words'])), // original.speakers.words (null-safe) 
    groupBy(prop('paragraph')),    // object with keys of para name, values of list of matching records 
    map(map(dissoc('paragraph'))),   // removing unneeded para from records 
    toPairs,        // {p1: [...words1], p2: [...words2]} => [[p1, [...words1]], [p2, [...words2]]] 
    map(zipObj(['paragraph', 'words']))  // expected output structure 
)(original) 

あなたは具体的には約groupByを尋ねました。 groupBy(prop('paragraph'))句の後、データは次のようになります。

{ 
    "p0-0": [ 
    {duration: "0.360000", name: "Arthur", paragraph: "p0-0", time: "0.660000"}, 
    {duration: "0.150000", name: "the", paragraph: "p0-0", time: "1.020000"}, 
    {duration: "0.380000", name: "rat", paragraph: "p0-0", time: "1.170000"}, 
    {duration: "0.770000", name: ".", paragraph: "p0-0", time: "1.550000"} 
    ], 
    "p1-0": [ 
    {duration: "0.360000", name: "Arthur", paragraph: "p1-0", time: "89.820000"}, 
    {duration: "0.390000", name: "stood", paragraph: "p1-0", time: "90.180000"}, 
    {duration: "0.090000", name: "and", paragraph: "p1-0", time: "90.570000"} 
    ] 
} 

残りはちょうどあなたが探しているの出力構造を得るためにいじっています。

Ramda REPLに結果が表示されます。 (パイプの後の行をコメントアウトすると、中間の結果が表示されます)

質問の後半では、あなたがこれまで試みたことを実証する新しいトピックを開くことをお勧めします。

+0

ok、ありがとう、私は新しい質問を開きます – khinester