2017-01-23 13 views
0

2つの配列を1つにマージしようとしています。 最初の設定はデフォルトの設定で、2番目の設定は実際の設定です。 私は非常によく似た問題hereを見つけましたが、私の特定のケースではうまくいきません。lodashを使用して2つの配列の中にオブジェクトをマージする

デフォルト設定:

[ 
    { configurationOption: 'X provisioning', platform: 'X', value: true }, 
    { configurationOption: 'Y provisioning', platform: 'Y', value: true }, 
    { configurationOption: 'Z provisioning', platform: 'Z', value: true } 
] 

実際の構成:

[ 
    { platform: 'X', value: false }, 
    { platform: 'Y', value: true } 
] 

期待される結果:だから、基本的に

[ 
    { configurationOption: 'X provisioning', platform: 'X', value: false }, 
    { configurationOption: 'Y provisioning', platform: 'Y', value: true }, 
    { configurationOption: 'Z provisioning', platform: 'Z', value: true } 
] 

デフォルトの設定の更新 'の値' プロパティには、それを行うために必要なものです実際のものに基づいて、難しい部分はconfigurationItemの一部が存在しないことです実際の設定では 'configurationOption'プロパティが実際に設定されていません。

var config = _.unionBy(actual, defaultConf, 'platform'); 

この行は、私が得ることができる最も近いものですが、 'configurationOption'プロパティがありません。あなたはそれで遊ぶことができるように

がここCodePenさ:https://codepen.io/anon/pen/oBwLMb?editors=0012

+0

は多分3番目の引数として「platofrm」という文字列のメソッドintsteadを与えることを試みます?あなたはそれが動作していないことを確認ですか?ここで働いているようです - > http://codepen.io/kejt/pen/PWjGWa?editors=1111 – Kejt

+1

'_.merge(defaultConf、actual)'が望ましい結果を生成していませんか? –

+0

実際の配列の各要素は、defaults配列の要素を持つプラットフォームによって1対1に対応していることが保証されていますか?言い換えれば、実際の配列は常にプラットフォームXとYをこの順番で含んでいますか? –

答えて

1

defaultsに基づいてオブジェクトの新しい配列を作成し、それぞれの要素がactualsで見つかった対応する実際のデータとそのデフォルトをマージした結果です、マッチングplatformに基づいています。

const defaults = [ 
 
    {configurationOption: 'X provisioning', platform: 'X', value: true}, 
 
    {configurationOption: 'Y provisioning', platform: 'Y', value: true}, 
 
    {configurationOption: 'Z provisioning', platform: 'Z', value: true}]; 
 

 
const actuals = [ 
 
    {platform: 'X', value: false}, 
 
    {platform: 'Y', value: true}]; 
 

 
var result = defaults.map(deflt => Object.assign(
 
    {}, 
 
    deflt, 
 
    actuals.find(actual => actual.platform === deflt.platform))); 
 

 
console.log(result); 
 
    

あなたがそう好む場合、これは_.map_.assign、および_.findを使用して、lodashを使用して書き換えることができます。

1

_.merge()を使用できます。

var config = _.merge({}, defaultConf, actual); 
console.log(config); 

http://jsbin.com/yuyegamaka/edit?js,console

更新:だからあなたのコードは、のように書くことができますが、結果として配列をしたい場合は、

var config = _.merge([], defaultConf, actual); 
+0

なぜ最初のパラメータが空のオブジェクトですか?私はリストとして自分の設定が必要です、私はこれが最終的な結果としてオブジェクトを返すと思います。 –

+0

しかしOPが望んでいると思われるので、これは 'platform'フィールドにマージされますか? –

+0

@torazaburoそうでなければ質問の目的を理解しているかわからない –

関連する問題