###実現したいこと
ベースとなるobj1
と、その更新情報であるobj2
という2つのオブジェクトがあります。
これらを比較し、関数update_obj()
によって、同じキーがあれば更新し、なければ追加という処理を実装したいです。
つまり以下の最後のresult
が得られればいいのですが、苦戦しています。
js
1var obj1 = { id:1, name:'a', date_info:{fst_date:'1月',snd_date:'2月'} }; 2 3var date_key = 'other_date'; 4var date_val = '3月'; 5var obj2 = { id:3, date_info:{[date_key]:date_val} }; 6 7var result = update_obj( obj1, obj2 ); 8console.log(result); 9/* 10result として以下を得たいです 11id を上書きし、date_info に other_date を追加するという結果です 12{ id:3, name:'a', date_info:{fst_date:'1月',snd_date:'2月',other_date:'3月'} }; 13*/
###発生している問題
上書きはできましたが追加ができません。そしてそれを解決しようとすると、追加でなく上書きになってしまいます。
###該当のソースコード
まずこちらを実行しますと、id
は3
に上書きできたのですが、date_info
にother_date
が追加できないのです。
js
1function update_obj( obj1, obj2 ){ 2 let result = obj1; 3 4 $.each(obj1, function(k1, v1) { 5 $.each(obj2, function(k2, v2) { 6 7 // 同じキーがあれば更新 8 if( k1 === k2 ){ 9 // 子階層があれば再帰 10 if( $.isPlainObject(v2) ){ 11 var child_result = update_obj( v1, v2 ); 12 var key = Object.keys(child_result)[0]; 13 result[k1][key] = child_result[key]; 14 } 15 // 子階層がなければ普通に上書き 16 else{ 17 result[k1] = v2; 18 } 19 } 20 }); 21 }); 22 return result; 23}
###試したこと
上のコードでは// 同じキーがあれば更新
という条件の中で処理をしていますが、今回追加したいother_date
は同じキーではないのでこの条件の外に処理が必要と考えています。
そのため次のように条件の外に// 同じキーがなければ追加
という処理を書いたのですが、こうしますと今度はdate_info
にother_date
を追加するのではなく、date_info
がother_date
だけになってしまう、といった状況になりました。
js
1function update_obj( obj1, obj2 ){ 2 let result = obj1; 3 4 $.each(obj1, function(k1, v1) { 5 $.each(obj2, function(k2, v2) { 6 7 // 同じキーがあれば更新 8 if( k1 === k2 ){ 9 /* 省略 */ 10 } 11 // 同じキーがなければ追加 12 else{ 13 result[k2] = v2; 14 } 15 }); 16 }); 17 return result; 18}
実現したいのはother_date
を追加するという処理なので、そのためにすべきことをお伺いできましたら幸いです。よろしくお願い申し上げます。
###補足情報
ちなみにupdate_obj()
の引数は変えず、obj1
のobj2
2つだけという前提がございます。
また念のため別の例として以下を掲載させて頂きます。
この場合、date_key
がother_date
(obj1
にないキー)でなく、fst_date
(obj1
にあるキー)なので、result
としてはfst_date
が上書きされる形になります。
これは先に記した該当のソースコードで実現できていますが、念のため別の例として掲載させて頂きました。
js
1var obj1 = { id:1, name:'a', date_info:{fst_date:'1月',snd_date:'2月'} }; 2 3var date_key = 'fst_date'; 4var date_val = '3月'; 5var obj2 = { id:3, date_info:{[date_key]:date_val} }; 6 7var result = update_obj( obj1, obj2 ); 8console.log(result); 9/* 10result として以下を得たいです 11id を上書きし、date_info の fst_date を上書きするという結果です 12{ id:3, name:'a', date_info:{fst_date:'3月',snd_date:'2月'} }; 13*/
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/07 11:20