2016-12-13 4 views
0

Ich suche in Ramda und t Fragen haben, aus der folgenden Ramda REPL:Suchen und Ersetzen mit Hilfe der funktionellen Javascript und 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); 

Wie verwende ich groupBy, um es mit den Ziffern anstelle der oben gruppiert zu erhalten Methode?

Von diesem Ergebnis, wie mache ich einen Fund einer Zeichenfolge, die ein oder mehrere Elemente haben kann, indem alle Wörter in der Reihenfolge der Zeit sortiert und nur die übereinstimmenden Absätze zurückgegeben werden?

search_criteria = 'Arthur stood'; 

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

Wie würden Sie diese Artikel durch replace = 'Arthuro stopped' ersetzen?

Jede Beratung wird sehr geschätzt.

Antwort

1

Eine Möglichkeit, Ihr erstes Problem mit Ramda lösen würde so aussehen:

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) 

Sie ausdrücklich darum gebeten, über groupBy. Nach der groupBy(prop('paragraph')) Klausel sieht die Daten wie folgt:

{ 
    "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"} 
    ] 
} 

Der Rest nur die Ausgabestruktur Sie suchen ist das Hantieren zu bekommen.

Sie können die Ergebnisse in der Ramda REPL sehen. (Wenn Sie spätere Zeilen in der Pipe auskommentieren, können Sie Zwischenergebnisse sehen.)

Für die zweite Hälfte Ihrer Frage, würde ich vorschlagen, dass Sie ein neues Thema öffnen und demonstrieren, was Sie bisher versucht haben.

+0

ok, danke, ich werde eine neue Frage öffnen – khinester