1

を使用すると、ファイルに次のデータを持っている想像:解析構造化データ(例えば変異なし)

Group1 
    Thing1 
    Thing2 
Group2 
    Thing1 
    Thing2 
    Thing3 
Group3 
Group4 
    Thing1 

これは、ファイルを介してライン・バイ・ラインをループする「パーサ」を書くのは簡単です、きちんとそれぞれのグループごとにグループ化され、オブジェクトにすべてのThing Sを書いて、その後(変数)現在Groupを覚えると:私を与える

// Very naive implementation for illustrative purposes only 
let groups = {} 
let currentGroup = null 
data 
    .split(/\n/) 
    .forEach(entry => { 
    const matches = entry.match(/^(Group\d+)$/) 
    if (matches) { 
     currentGroup = matches[1] 
     groups[currentGroup] = [] 
    } else { 
     groups[currentGroup].push(entry.trim()) 
    } 
    }) 

{ 
    Group1: [ 
    'Thing1', 'Thing2' 
    ], 
    Group2: [ 
    'Thing1', 'Thing2', 'Thing3' 
    ], 
    ... 
} 

純粋に機能的な方法でgroupscurrentGroupに変更することなくこれを達成する最良の方法は何ですか? Array.reduceをもっと見てみる必要がありますか?これは、ArrayをObjectに変換するためのいくつかの(IMHOでは、あまり気にしない)ユースケースを見たことがあるか、ここで役に立たないのですか?

+0

*何も変わらないことを意味しますか?グループをグループ化して次の部分をグループ化する必要があります。 –

+0

私は、既存の**値を変更するのではなく、変更されたコピーを作成することについて話していました。これは機能プログラミングのパラダイムの典型です。たとえば、 'let person = {name: 'Nina'}の代わりに。 person.lastName = 'Scholz''、 'const person = {name:' Nina '}が好きです。 const personNew = Object.assign({}、person、{lastName: 'Scholz'}) ' –

+1

これは簡単に再帰で実現できます。現在のエンジンは再帰のために最適化されていません(TCOなし)。だからあなたは、提案された解決策に忠実に従う。 – ftor

答えて

2

はい、あなたはここにreduceを使用したいと思います:

data 
.split(/\n/) 
.reduce(({groups, currentGroup}, entry) => { 
    const matches = entry.match(/^(Group\d+)$/) 
    if (matches) { 
    groups[matches[1]] = [] 
    return {currentGroup: matches[1], groups}; 
    } else { 
    groups[currentGroup] = groups[currentGroup].concat([entry.trim()]); 
    return {currentGroup, groups}; 
    } 
}, {groups: {}, currentGroup: null}) 
.groups 

しかし、変異なしでマップオブジェクトを作成するためのJSには合理的な方法はありません。不動産物件をローカルに保管する限り、それには何も問題はありません。

+0

ありがとう!私はちょうど地元の課題に良い選択肢があるかどうか疑問に思っていた。 –

関連する問題