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

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

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

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

Q&A

解決済

2回答

4187閲覧

【Javascript】2つのJSONを見て、同じ配列があった時にまとめる方法

west_side_park

総合スコア45

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

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

0グッド

0クリップ

投稿2021/03/26 05:20

編集2021/03/26 06:41

実現したいこと

Node,jsを使ったシステムの改修作業を担当することになりました。
大まかな流れは以下になります。

  1. object_id をキーにして、DBに登録されているjson1を取り出す
  2. 共通のobject_idを持ち、object_dataの中身が違うjson2があるので、json1に追記したい

例)

json1

1{ object_id: '1', 2 object_data: 3 [ { data_id: '1', 4    data_type: 'A' 5 enabled: true } ], 6 created_at: '2021-03-25', 7 created_by: '太郎' } 8

json2

1{ object_id: '1', 2 object_data: 3 [ { data_id: '2', 4    data_type: 'B' 5 enabled: true } ], 6 created_at: '2021-03-25', 7 created_by: '太郎' } 8

↓ 期待する実行結果

json1

1{ object_id: '1', 2 object_data: 3 [ { data_id: '1', 4    data_type: 'A' 5 enabled: true }, 6   { data_id: '2', 7    data_type: 'B' 8 enabled: true } 9 ], 10 created_at: '2021-03-25', 11 created_by: '太郎', 12 updated_at: '2021-03-26', 13 updated_by: '次郎' } 14

現状のプログラム

現状の仕様は、json1が持つobject_dataは1つのオブジェクトしか無い前提なので、
中身の違うデータが送られてくると、上書きされるようになっています。
しかし、今回の改修で、複数のオブジェクトを持つようにしたいということで今回の質問をしました。

Object.assign(json1, json2);

↓ 実行

json1

1{ object_id: '1', 2 object_data: 3 [ { data_id: '2',  ←json2のデータで上書きされる 4    data_type: 'B' 5 enabled: true } 6 ], 7 created_at: '2021-03-25', 8 created_by: '太郎', 9 updated_at: '2021-03-26', 10 updated_by: '次郎' } 11

試したこと

同じデータが送られた時はこれまで通りで、違うデータが来た時にjson1に追加

javascript

1 const aJSON = JSON.stringify(json1.object_data); 2 const bJSON = JSON.stringify(json2.object_data); 3 if (aJSON === bJSON){ 4 Object.assign(json1, json2); 5 } else { 6 json1.object_data.push(json2.object_data); 7 }

↓ 実行結果

json1

1{ object_id: '1', 2 object_data: 3 [ { data_id: '1', 4    data_type: 'A' 5 enabled: true }, 6   [{ data_id: '2', 7    data_type: 'B' 8 enabled: true } ] 9 ] 10 ], 11 created_at: '2021-03-25', 12 created_by: '太郎', 13 updated_at: '2021-03-26', 14 updated_by: '次郎' } 15

このように、配列の中にさらに配列が追加されるという形で出力されてしまいます。

もう一点問題なのは、aJSON === bJSONとしたとき、
例えば期待通り以下の状態のデータが保持できているとき

object_data: [ { data_id: '1',     data_type: 'A' enabled: true },    { data_id: '2',     data_type: 'B' enabled: true }  ],

json3として以下のデータが来た時に、aJSON !== bJSONとなってしまう点です。

object_data: [ { data_id: '1',     data_type: 'A' enabled: true }  ],

json1に含まれていないdata_idが来た時だけ、連結するという動きにする必要があります。
mapやreduceを使えば解決できるのかもしれないのですが、
実務未経験で初めてjavascriptを触っている状態なので、qiitaなどを参考にしても理解が追い付いていません。

ご教授、お願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

このように、配列の中にさらに配列が追加されるという形で出力されてしまいます。

json1.object_data.push(json2.object_data);というコードを実行すればそうなります。
json2.object_data は配列ですから json1.object_data の末尾にそれを追加すれば、当然配列の中にさらに配列が追加されます。

おそらくあなたが求めているのは、配列を結合するconcatメソッドではないでしょうか?

javascript

1[1, 2, 3].concat( [4, 5, 6] ) //  [1, 2, 3, 4, 5, 6]

投稿2021/03/26 05:39

ku__ra__ge

総合スコア4524

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

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

west_side_park

2021/03/26 06:24

ご回答ありがとうございます。 json1.object_data.push(json2.object_data);を、 json1.object_data.concat(json2.object_data);に置き換えて実行してみました。 結果としては、json1.object_dataに変化がないという状態でした。 VSCodeを使っていまして、 「pu」と打てば予測変換で「push」が出るのですが、 「concat」は予測変換で出てこず、concatの文字にハイライトがついているので、 何かしらの原因でconcatが動いていないのだと思います。 試しに以下のsampleファイルを作成したら、こちらはconcatで期待通りの値が出ました。 const json1 = { object_id: '1', object_data: [{ data_id: '1', data_type: 'A', enabled: true }], created_at: '2021-03-25', created_by: '太郎' } const json2 = { object_id: '1', object_data: [{ data_id: '2', data_type: 'B', enabled: true }], created_at: '2021-03-25', created_by: '太郎' } const result = json1.object_data.concat(json2.object_data); console.log(result);
west_side_park

2021/03/26 07:18

上記、concatが動かない件についてはまだ原因が不明なのですが、 json1.object_data.push(...json2.object_data); とすることで、期待していた値をとることができました。 配列に配列を追加しているから~という指摘をいただけたので思いつきました。 ありがとうございます。
guest

0

ku__ra__ge さんから頂いた回答をもとに解決しました。

回答で頂いたconcatがなぜか実行できないという点は解消していないのですが、

json1.object_data.push(...json2.object_data);

とすることで、スプレッド構文を使って配列の中身をpushするという手段を使いました。
配列に配列をpushしているというミスに気付けて良かったです。

投稿2021/03/26 07:21

west_side_park

総合スコア45

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問