2016-07-01 4 views
2

私はLodash's mergeと同等の関数を見つけようとしています。Ramdaを使用すると、再帰的オブジェクトのキーベースの "マージ"または "拡張"を行います。動作は次のようになります。Ramdaを再帰的に「マージ」または「拡張」しますか?

let merged = R.someMethod(
    { name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
    { address: { street: 'Pine', number: 33 }} 
); 

console.log(merged); 

// => { name: 'Matt', address: { street: 'Pine', number: 33, suffix: 'Ave' }} 

私はR.setが簡単に紹介されたことを、次のpull requestに気づいたが、その後、その後すぐrolled back。この機能はRamdaライブラリによってキャプチャされていますか?

この機能はRamdaで利用できますか?

答えて

2

Ramdaには、このような関数が含まれていません。

これを作成する試みがいくつかありましたが、実際にそのような機能に本当に必要なものの概念を構築しているようです。

あなたが追加する価値があると思うなら、raise an issueと自由に感じてください。

+0

そして、私は機能自体を持っている欲望がこの時点で非常に大声で話していることを確信していません... – Himmel

+0

もちろん、好きです。私はそのような機能を追加するには、進行中の、しかしかなり低いプレッシャーがあると思います。しかし、私をはじめ、多くの人が抵抗しています。なぜなら、プロトタイプチェーン、「未定義」、および循環構造に直面して、APIが素晴らしいとは思わないからです。しかし、それはおそらく、完璧なものが財の敵であるケースです。 –

6

R.mergeWithを使用すると、比較的単純な再帰関数を作成できます。私は本当に、テーブルに任意の微妙な意見を持っていないなど、私はそれが問題を作成する価値があると思うが、私は配列をマージし、未定義の値に対処する方法について同じ古いビットを焼き直しを憎む

function deepMerge(a, b) { 
    return (R.is(Object, a) && R.is(Object, b)) ? R.mergeWith(deepMerge, a, b) : b; 
} 

deepMerge({ name: 'Matt', address: { street: 'Hawthorne', number: 22, suffix: 'Ave' }}, 
      { address: { street: 'Pine', number: 33 }}); 

//=> {"address": {"number": 33, "street": "Pine", "suffix": "Ave"}, "name": "Matt"} 
+0

これは、このような関数をどのように動作させるかによって異なりますが、値の型にかかわらず、最初の引数として渡されたキー/値を上書きするために、2番目の引数として渡されるキー/値を優先します。このような機能は '(R.is(Object、b))? ...(R.is(Object、a))ではなく... ... 'ではなく、...となります。 – Himmel

+1

同じキーで異なる型を扱う可能性がある場合は、 'mergeWith'を呼び出す前に' a'と 'b'の両方がオブジェクトであることを確認する必要があります。私はその事実を反映させるために例を更新しました。 –

+0

シンプルな配列で動作するように少し修正されたバージョン '' '' '' '' '' '' '' '' '' '' '' '' '' '' b :(R.is(Object、a)&& R.is(Object、b))? R.mergeWith(deepMerge、a、b):b''' – baio

関連する問題