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

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

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

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

jQuery

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

Q&A

解決済

2回答

1330閲覧

連装配列の値を更新したい

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2018/01/11 09:44

編集2018/01/11 15:18

###前提・実現したいこと
tableがクリックされた時にその行に設定されている日付のSQLに記録されているダメージログを取得し、ネーム別に合計値を算出しようとしましたが連装配列combatantにデータが登録されず
申し訳ありませんforeachループ中にはcombatantに値は正常に記録されているようでした。ですがforeachを抜けると変数combatantの値が消えているようです。なぜ中身が消えるのか教えていただきたいです。
###該当のソースコードJavaScript

var combatant_o = {}; var pie_data = []; $("#logtable tbody td").bind("click", function () { var datetime = $(this).closest('tr').children('td:eq(0)').text().replace(/\r?\n/g, "").trim(); //console.log("||" + datetime + "||"); $.getJSON('db.php', { "datetime": datetime }, function (j_data) { var combatant = {}; //console.table(j_data); //console.table(j_data[0]); $.each(j_data, function (i, item) { $.each(j_data[i], function (j, iteml) { var player_data = j_data[i][j]; //console.table(player_data); //console.log(j_data[i][key]["char_name"]+":"+j_data[i][key]["atk_dmg"]); //console.table(j_data[key]); if (combatant[player_data["char_name"]]) { combatant[player_data["char_name"]] = (combatant[player_data["char_name"]] + player_data["atk_dmg"]); //console.log(player_data["char_name"] += ":" + player_data["atk_dmg"]); } else { // console.table(player_data); //console.log(player_data["char_name"] + ":" + player_data["atk_dmg"]); combatant[player_data["char_name"]] = player_data["atk_dmg"]; } console.table(combatant); combatant_o = combatant; }) } ) } ) console.table(combatant_o); Object.keys(combatant_o).forEach(function (key) { console.log(key + ":" + combatant_o[key]); pie_data.push([key, combatant_o[key]]); }) drawChart(); });

###試したこと
・変数のスコープの問題かと思い一番外側にcombatant_oを用意し、foreach中にcombatantから値渡しをしたがループが終わるとcombatant_oにも値が記録されなかった

配列の構造について
イメージ説明
j_data
イメージ説明
jdata[0]
イメージ説明
jdata[0][0]

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

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

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

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

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

moredeep

2018/01/11 13:47

j_dataの中身がわからなければまともな回答は得られないと思います。
退会済みユーザー

退会済みユーザー

2018/01/11 14:15

申し訳ありません、配列の構造についてはこれでよろしいでしょうか?
guest

回答2

0

ベストアンサー

コールバック関数は外部の処理が終わるまで処理キューが後回しになるのを忘れていました、データ加工のfor文をjson取得のコールバック関数内部に配置したところ正常に動作しました。

投稿2018/01/11 23:36

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

追記ありがとうございます。

連想配列の使用方法に手間取っている様子、
for文(for (key in j_data[i]))がいらないので削除、全ての[key]も削除で動作するのではないでしょうか。

for(var key in Object)とした場合、keyには連想配列のキー(char_nameやatk_dmg等)が順番に入ります。
j_data[i][key]["char_name"]は、値を展開したときに、j_data[0]["char_name"]["char_name"]のような形になってしまいます。

投稿2018/01/11 14:26

moredeep

総合スコア1507

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問