質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

1回答

1560閲覧

2つのjQueryオブジェクトを比較し、「キーがなければ追加」をしたい

kuroean

総合スコア12

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

1クリップ

投稿2020/04/07 10:31

###実現したいこと
ベースとなる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*/

###発生している問題
上書きはできましたが追加ができません。そしてそれを解決しようとすると、追加でなく上書きになってしまいます。

###該当のソースコード
まずこちらを実行しますと、id3に上書きできたのですが、date_infoother_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_infoother_dateを追加するのではなく、date_infoother_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()の引数は変えず、obj1obj22つだけという前提がございます。

また念のため別の例として以下を掲載させて頂きます。
この場合、date_keyother_dateobj1にないキー)でなく、fst_dateobj1にあるキー)なので、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*/

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

投稿2020/04/07 11:10

Lhankor_Mhy

総合スコア36960

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kuroean

2020/04/07 11:20

これはありがとうございます!私が欲しい関数そのままでした///笑
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問