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

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

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

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

Q&A

解決済

4回答

1495閲覧

配列において、要素が代入されているにも関わらず空として扱われる

yuki_90453

総合スコア326

JavaScript

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

0グッド

0クリップ

投稿2017/05/21 06:57

編集2017/05/21 10:19

いつもお世話になっております。
配列を定義し、forの中でkeyを配列に代入したいと考えております。

実際のコードは下記のようになっているのですが、配列には代入されているようですが、中身を参照出来ません。
画像を添付致しますのでそちらを確認して頂ければわかると思いますが、配列に要素が入っているが、空として扱われます。
私には、どうしてこのような事が起こるのかわからないので、どなかアドバイスお願い致します。

javascript

1 var item_list2 = []; 2 $.ajax({ 3 url:'test001.jsonp', 4 type: 'GET', 5 dataType: 'jsonp', 6 timeout: 5000, 7 jsonpCallback: 'reviews', 8 }).done(function(jsonData){ 9 for(var j_item_id in jsonData){ 10 item_list2.push(j_item_id); 11 } 12 }) 13 console.log(item_list2)

イメージ説明

###追記
対象のJSONPファイル

reviews({ "110621449": { "商品名": "bbbb", "レビュー": { "205332": { タイトル: "テキスト", 評価数: "5", 本文: "テキスト", 日時: "2017/03/29" }, "レビューID_2": { タイトル: "", 評価数: "2", 本文: "テキスト", 日時: "2017/03/27" }, "レビューID_3": { タイトル: "", 評価数: "2", 本文: "テキスト", 日時: "2017/03/27" }, "レビューID_4": { タイトル: "", 評価数: "2", 本文: "テキスト", 日時: "2017/03/27" } } }, "110621446": { "商品名": "aaaa", "レビュー": { "レビューID_1": { タイトル: "2222", 評価数: "5", 本文: "テキスト", 日時: "2017/03/29" }, "レビューID_2": { タイトル: "3333", 評価数: "2", 本文: "テキスト", 日時: "2017/03/27" } } }, });

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

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

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

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

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

guest

回答4

0

以下を調べてください。

(1) test001.jsonp をサーバーに GET 要求したらどのような応答が返ってくることになっているのか?

(2) 実際の応答は期待通りか?

(3) jsonData には何が渡されることを期待しているか?

(4) 実際には jsonData には何が渡されているか?

test001.jsonp は質問者さんが実装した Web API ではないかと思いますが、そうだとすると (1) の答えは質問者さんにしか分かりません。始まりが分からないと答えようがないのですが・・・

投稿2017/05/21 07:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yuki_90453

2017/05/21 07:33

回答頂きありがとうございます。 上記のjsonpファイルは私が実装した物です。 本番環境ではドメインが異なるサーバーから、ajaxでデータを参照しなければいけないのでjsonpを使用しています。 テスト環境では、ローカル環境で製作しております。 渡されているデーターは文字列のはずです。配列に追加しようして要素をconsole.log()で表示させて見ると問題なく表示されますが、配列に代入しようとすると最初に添付した画像のようになります。 そもそも添付した画像は、どのような状態なのか、全くわかりません。 配列の括弧内は空であるが、lengthは要素の数を示しています。 (1)は、文字列が帰ってくるようになっています (2)は、期待どうりです。 console.log((j_item_id)を参照すると文字列が帰ってきます。 (3)文字列 (4)文字列でした。型も問題なく文字列でした。
退会済みユーザー

退会済みユーザー

2017/05/21 09:48 編集

> (1)は、文字列が帰ってくるようになっています その文字列って何でしょう? JSONP と言うと、私の理解の範囲では、返ってくる文字列はコールバックの引数に JSON 文字列がセットされたものなのですが(以下の URL の記事参照)、質問者さんの言う「文字列」はどういうものですか? JSONP https://ja.wikipedia.org/wiki/JSONP もし違うとすると、質問者さんの言う JSONP と、私の理解の範囲での JSONP は違うようです。 理解が違うと、この先話をしてもすれ違うばかりと思われますので、質問者さんの言う JSONP を具体的に説明してください。
yuki_90453

2017/05/21 10:30

回答頂きありがとうございます。 >その文字列って何でしょう? 今回のケースでいうと、110621446や110621449ですが、そういった意味の質問ではないかと思います。。。 私の扱うJSONPは、JSON形式のデーターファイルをJSONPに書き換えた物です。 データーファイルとして使用しているので、JSONP内でプログラムが動きコールバックが帰ってくるように設計していません。(厳密にはJSONPもjavascriptファイルと同じ扱いでしょうからコールバックとして動作してかとは思いますが。。。) コールバックされた物は連想配列かと思います。そこからforで分解し、keyに当たる部分を配列に代入したいと考えております。 先程、JSONPファイルを追記致しました。
退会済みユーザー

退会済みユーザー

2017/05/21 22:47 編集

> 私の扱うJSONPは、JSON形式のデーターファイルをJSONPに書き換えた物です。 そこに JSONP に関する誤解があるように思えます。 先のレスで紹介した Wikipedia の記事のコード例、 parseResponse({"Name":"Smith","Rank":7}) で言うと、parseResponse がコールバックの名前、その引数が JSON 文字列です。 jQuery.ajax を使った場合は引数が JavaScript オブジェクトに変換されて function(jsonData) の jsonData に渡されるので、function 内で jsonData.Name で "Smith" が、jsonData.Rank で 7 を取得できるということになるはずです。 質問者さんが最初の質問に追記されたコールバック review の引数は有効な JSON 文字列になっていない(javascript オブジェクトにパースできない)のでは? それで何を取得できるのかは、自分の想定外のことをされているので自分には分かりません。
退会済みユーザー

退会済みユーザー

2017/05/22 02:17 編集

想像ですが、最初の質問にあった console.log(item_list2) の結果から以下のようなことになっているのではないかと思われます。 (1) JSON パーサーは JSON 文字列の多少の間違い(名前が " で囲ってないなど)は見逃してくれて、jsonData にはコールバック reviews の引数の文字列からパースされた JavaScript オブジェクトが渡された。 (2) jsonData に渡された JavaScript オブジェクトには 110621449 と 110621446 という 2 つのプロパティが含まれる。 (3) for(var j_item_id in jsonData) で j_item_id には、for ループの一回目に 110621446、二回目に 110621449 が渡される。 (4) item_list2.push(j_item_id) で配列 item_list2 に 110621449 と 110621446 を追加。 (5) console.log(item_list2) で item_list2 は配列で、item_list2[0] が 110621446、item_list2[1] が 110621449 という情報が表示された。 というわけで、「空として扱われます」ということではなくて、例えば「item_list2[0].商品名」で文字列 "aaaa" が取得できるのではないかと思います。
guest

0

自己解決

変数が上手く参照出来なかったのが原因ようでした。
forの部分を関数化して引数で値を打たせば上手く行きました。

投稿2017/05/22 10:01

yuki_90453

総合スコア326

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

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

退会済みユーザー

退会済みユーザー

2017/05/22 10:21 編集

もっと具体的に、どのようの解決したのか書いてください。あなたにはその義務(とまでは言わなくてもそれに近いもの)があると思います。
guest

0

とりあえず全部値を出してみてはいかがでしょうか。

JavaScript

1.done(function(jsonData){ 2 console.log(jsonData); 3 for(var j_item_id in jsonData){ 4 console.log(j_item_id); 5 item_list2.push(j_item_id); 6 } 7 console.log(item_list2); 8})

投稿2017/05/22 04:48

kei344

総合スコア69366

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

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

0

callbackの処理の前に、item_list2を表示してませんか?

投稿2017/05/22 03:20

tmp

総合スコア277

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

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

退会済みユーザー

退会済みユーザー

2017/05/22 04:18

> callbackの処理の前に、item_list2を表示してませんか? 質問者さんのコードを見る限りそれはないはずです。 何故なら、jQuery.ajax を使うと、JSONP を利用してデータを取得する際以下のことを自動的にやってくれるからです。 (1) jQuery.ajax を呼び出した時点で script タグを生成し DOM ツリーへ追加。 (2) 呼出先の URL にコールバックの名前を指定するクエリ文字列 &callback=jQuery... を追加。(今回のケースではこの機能を利用していませんが) (3) 応答が返ってくるとコールバックが呼び出され、引数に設定された JSON 文字列が JavaScript オブジェクトにパースされ、成功時に起動されるコールバック function の引数(今回のケースでは jsonData)に渡される。
tmp

2017/05/22 08:38

console.log(item_list2)が.done()の外にあったら非同期で先に実行されてしまうかと思いましたが違いますか?
退会済みユーザー

退会済みユーザー

2017/05/22 09:14

質問者さんの質問に console.log(item_list2) の結果を示す画像が貼ってありますが、それを見る限り「非同期で先に実行されてしまう」ということはないようです。実際に検証まではしてませんが、結果がそうなったというのは間違いないと思ってます。
tmp

2017/05/22 09:27

質問者が空と判断したのはconsole.log(item_list2)の結果からだと思います。そしで非同期処理が終わりデバッガーなどで表示すると配列に要素が入ってると判断したと思います。 なぜならconsole.logでは貼り付けた画像のようにならないと思い、デバッガ等で表示したものと判断しました。
退会済みユーザー

退会済みユーザー

2017/05/22 09:40

> console.logでは貼り付けた画像のようにならないと思い、デバッガ等で表示したものと判断しました。 そうですか、私の理解が間違っていたかもしれません。質問者さんに出てきてもらって kei344 さんが言われるように全部値を出してもらわないと話が進まないかもしれませんね。 #なんで質問者さんは出てこないのだろう??????
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問