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

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

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

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

1回答

3423閲覧

2つのJSONファイルをAJAXで読み込んで、一つにobjectにマージする方法を教えてください

qwe001

総合スコア133

JavaScript

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

jQuery

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

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

2クリップ

投稿2019/03/18 04:26

jQuery(ver3系)を用いて、外部ファイルを読み込むコードを次のように書きました。

(function($){ 'use strict'; const LIST_PATH_NEW = "./data/list.json"; const LIST_PATH_OLD = "./list.json"; function loadJson(jsonPath) { var defer = $.Deferred(); $.ajax({ type : "GET", url : jsonPath, dataType: "json", success: defer.resolve, error: defer.reject }); return defer.promise(); } function getList(listPath) { return loadJson(listPath); } function getNewList() { return getList(LIST_PATH_NEW); } function getOldList() { return getList(LIST_PATH_OLD); } $(function(){ var newList = getNewList(); var oldList = getOldList(); newList.done(function(data){ var myList = data.list; console.log(myList); }); oldList.done(function(data){ var myList = data.list; console.log(myList); }); // ★ ここらへんで array_merge みたいなことがしたいです ★ }); })(jQuery);

それぞれのAJAXから返ってくるデータは次のような形です。(簡略化しています)

{ "list": [ { "image": "aaa.jpeg", "title": "新しいやつ", "date": "2019-03-17", }, ] }

各オブジェクトのプロパティ名は両方とも同じです。
データの総数は古いほうが500件あまりで固定、新しいほうは5件あまりで今後増大していきます。

過去のデータと、新しいデータを一つのオブジェクトデータにマージし、
それをもとにフロントで色々する、といった感じです。

これら2つのデータは別々の管理システムから出力されており、
データのインポート/エクスポートの仕組みもないため、元ファイル自体をマージするということはできません。
(直接編集したところで次にシステムから出力された時に編集内容が上書きされる)

PHPで言うところの array_merge みたいなことをして、一つのオブジェクトデータにしたいのですが、
どのようにすれば実現できますでしょうか。

皆様お知恵を貸してください。よろしくお願いいたします。

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

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

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

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

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

m.ts10806

2019/03/18 04:34

追加した結果、どのような内容になるのか、inputとoutputのデータをなるべく具体的に例示してください。 結局はオブジェクトのマージなのでその角度から調べればある程度参考になりそうな情報は出てきそうですが、そのあたりは何か調べてみましたか?
guest

回答1

0

ベストアンサー

それぞれのAJAXから返ってくるデータは次のような形です。(簡略化しています)
各オブジェクトのプロパティ名は両方とも同じです。

簡略化しすぎです。
何を簡略化したのですか?
そして、マージしたい2つのJSONデータはどこに差異があるんですか?

オブジェクトに単体でlistというプロパティがあるのって中々の変態ですね。
普通配列じゃないですか?
つまり、他にもエラー理由やお知らせデータなんかも入ってくるんですか?
これらもマージしなさいみたいな話になってくると、読み取りようがないので勘弁してください。

この辺の理由から回答者は色々想像を働かせて、当てずっぽうな回答をせざるを得ません。
良い質問ってのはどうしても技量が求められますので、駄目だったら色々追記してみてください。


どちらも下記のデータである事と想定します。

  • オブジェクトのJSONであること
  • listプロパティ(中身は必ず配列)を所持している
  • list配列はオブジェクトの配列である
  • list配列内の各オブジェクトはプロパティ名等は統一されている

// ★ ここらへんで array_merge みたいなことがしたいです ★

無理、Ajaxは非同期です。
だからわざわざnewList.doneとかやってるんです。

取っ掛かりは下記を勉強しましょう。
jQuery.when() で、複数の非同期処理を扱う

jQuery.whenを使って両方のAjax通信が終わったタイミングで動かすにはこんな感じになるでしょう。

JavaScript

1$(function(){ 2 var newList = getNewList(); 3 var oldList = getOldList(); 4 5 $.when(newList, oldList) 6 .done(function(dataNew, dataOld){ 7 var myListNew = dataNew.list; 8 var myListOld = dataOld.list; 9 10 // ここらへんでarray_mergeみたいなことがしたい 11 });

マージのやり方

JavaScriptはPHPより進んだオブジェクト指向言語ですので、
連想配列的な存在であるオブジェクト、配列、関数、文字列、数値、論理値は
全てプロパティやメソッドを所持しています。

余談ですが、
JavaScriptは文字列・数値・論理値はプリミティブ値としても振る舞うので、
プロパティを参照した時だけ一時的にオブジェクトに変身し、
行の最後でプリミティブ値に戻るというヘンテコな動きをします。

// PHPではインスタンス以外はプロパティやメソッドを所持していないのでエラーになる ('hoge,piko')->split(','); // なのでPHPではこうする explode(',', 'hoge,piko'); // JavaScriptではString型がメソッドを所持しているのでアクセスしても許される "hoge,piko".split(',');

JavaScriptの配列(Array型のインスタンス)は配列自身が色々とメソッドを所持しています。
例えば、配列AとBをマージするArray.prototype.concatというメソッドが最初から用意されているので、
配列のマージ結果が欲しいという場合はそれを実行するだけでおしまいです。

JavaScript

1var arr1 = [1, 2]; 2var arr2 = [3, 4]; 3 4console.log(arr1.concat(arr2)); 5// [1, 2, 3, 4] 6 7console.log(arr1); 8// [1, 2] <- arr1が破壊されないので安心して使えるね 9 10console.log(arr2); 11// [3, 4] <- こちらも無事

PHPが配列操作の関数を沢山覚える事が力になるのと同様に、
JavaScriptは型が所持しているメソッドを沢山覚えるのが力になる言語です。
JavaScriptを本気でやるならメソッドに焦点を当てて学習してみてください。

投稿2019/03/18 05:21

編集2019/03/18 05:24
miyabi-sun

総合スコア21158

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

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

qwe001

2019/03/18 06:01

大変丁寧なご回答、ありがとうございます。whenメソッドとconcatメソッドを使うことで考えた通りのことが実行できました。こちらBAとさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問