2017-01-03 4 views
0

ここで機能プログラミング初心者。Functional programming/Ramda:入れ子になったプロパティを選択して新しいオブジェクトを作成する

{ 
    id: '2014d5db-55dc-4078-ae87-382c226d0785', 
    phone: '00447827434313', 
    ... 
} 

は基本的に_sourceを抽出し、id_idの名前を変更する:私はこのフォーマットでそれを持ってしたいエンドで

{ 
    _id: '2014d5db-55dc-4078-ae87-382c226d0785', 
    _source: { 
    phone: '00447827434313', 
    ... 
    } 
} 

:私は、このオブジェクトを持っています。

私は以下のこの機能を作成しましたが、新しいオブジェクトを手動で作成する代わりに、Ramdaの関数だけを使用しようとしています。私はそれがより機能的な方法だと思いますが、それが本当に問題でないかどうか私に教えてください。

const test = o => merge(o._source, { id: o._id }) 

どうもありがとうございました

+0

あなたの出力は常にそのようにフラットになりますか? (ネストされたプロパティはありません) –

+0

@ScottSauyet理想的にはyesです。私はちょうど '_source'の中に何でも持っていて、上に' _id'を追加したいと思います。名前は 'id'です。 –

答えて

1

私はそのための特定のビルトインRAMDA機能がないと思います。しかし、それはlensPathの上に1、view、およびmapを書くことは難しいことではありません。

const remap = R.curry((desc, obj) => R.map(path => R.view(R.lensPath(path), obj), desc)); 

const myExtract = remap({ 
    id: ['_id'], 
    phone: ['_source', 'phone'] 
}); 

myExtract(input); 
//=> {"id": "2014d5db-55dc-4078-ae87-382c226d0785", "phone": "00447827434313"} 

あなたの出力は、フィールドのフラットリストとして記述されている(もちろん、そのプロパティ自体がオブジェクトでできればそれは単にこれを動作します。 )しかし、あなたが入れ子になったパスから引っ張って入れ子にしたパスにプッシュしたものは、書くのが難しくありません。しかし、私の想像するところでは、ユーザーAPIは醜いでしょう。

これをポイントフリーにするためのきれいな方法は見当たりませんが、読みやすさを保ちます。おそらく他の誰かがそれを管理しているかもしれませんが、これはすでにかなり良いと思います。

Ramda REPLでこれが確認できます。

+0

ありがとう@ScottSauyet、これは非常に役に立ちます。私の 'test()'関数は機能的なやり方ではないと思いますか?私はちょうど私が何かを探すことが公正であることを確かめたいです –

+2

私はそこに一つの答えがあるとは思わない。あなたのものは最も簡単な方法です。もしあなたが何かを再利用できるようにする必要がなければ、それだけではいかがですか?別のフィールドがマッピングされている状態でそれを再利用する予定の場合は、私の提案が改善されるかもしれません。より複雑な構造にマップしたい場合は、さらに洗練されたものが必要です。オリジナルの唯一の欠点は、 'source'からインクルードしたくないフィールドが含まれている可能性があることです。それが心配しなければ、それはそれ自身で完全に有効な解決策です。 –

関連する問題