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

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

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1979閲覧

【JavaScript】連想配列で指定したキー以外の要素にも値が上書きされて格納されてしまう。

dimyas

総合スコア24

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2021/06/29 23:42

編集2021/06/29 23:50

html

1<body> 2 <div index="data1" onclick="save(this)">1</div> 3 <div index="data2" onclick="save(this)">2</div> 4 <div index="data3" onclick="save(this)">3</div> 5 <div index="data4" onclick="save(this)">4</div> 6<script> 7</script> 8</body>

javascript

1 //<script> 2 var save_file={"data1":{},"data2":{},"data3":{},"data4":{}}; 3 var save_data={"hp":100,"name":"aaaa","num":""}; 4 var num=0;//何回目か数える 5 6 function save(index){ 7 console.log(save_data); 8 save_data["num"]=num; 9 var index_data=index.getAttribute("index");//divのindex属性でどこにデータをセーブさせるか決めさせる 10 console.log(index_data); 11 12 save_file[index_data]=save_data;/ここで格納 13 14 console.log(save_file);//しかし二回目以降は前回入れた値もキーが違うのに上書きされてしまう 15 num++; 16 } 17 //</script>

1回目で「1」のdiv要素をクリックすると...

最後の

javascript

1console.log(save_file);

では

{data1: {…}, data2: {…}, data3: {…}, data4: {…}} data1: {hp: 100, name: "aaaa", num: 0} data2: {} data3: {} data4: {} __proto__: Object

と出力される

しかし2回目で「2」のdiv要素をクリックすると

{data1: {…}, data2: {…}, data3: {…}, data4: {…}} data1: {hp: 100, name: "aaaa", num: 1} data2: {hp: 100, name: "aaaa", num: 1} data3: {} data4: {} __proto__: Object

と出力され、1回目のdata1のnum:0が2回目のdata2のnum:1と同じ値に上書きされている。

なぜこうなるのか分からない

【補足】

javascript

1 save_file["data1"]={"a":"a","b":"b"}; 2 save_file["data2"]={"c":"c","d":"d"}; 3 save_file["data1"]={"e":"e","f":"f"}; 4 console.log(save_file);

を実行すると

{data1: {…}, data2: {…}, data3: {…}, data4: {…}} data1: {e: "e", f: "f"} data2: {c: "c", d: "d"} data3: {} data4: {} __proto__: Object

問題なくこう表示された。
このように別々のキーに保存する法王はないだろうか?

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

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

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

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

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

int32_t

2021/06/29 23:45

今起きている現象はわかりましたが、どういう動作が欲しいのですか?
dimyas

2021/06/29 23:54 編集

出力されるコンソールログが ``` {data1: {…}, data2: {…}, data3: {…}, data4: {…}} data1: {hp: 100, name: "aaaa", num: 0} data2: {hp: 100, name: "aaaa", num: 1} data3: {} data4: {} __proto__: Object ``` となり、選択されたdivタグによって別々のキーに値が保存される動作にしたいです。
guest

回答1

0

ベストアンサー

save_dataという同じオブジェクトを代入しているので、全部同じになります。

投稿2021/06/29 23:50

maisumakun

総合スコア146018

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

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

dimyas

2021/06/29 23:57 編集

つまりどこをどう書き換えればいいのでしょうか? オブジェクトの中にオブジェクトは入れれないということですか? 配列の中に配列は代入できないということですか? たとえ添え字をちゃんと指定していても
maisumakun

2021/06/30 00:00

> つまりどこをどう書き換えればいいのでしょうか? 毎回新しいオブジェクトを作って、それをsave_fileの要素として代入しましょう。
dimyas

2021/06/30 00:12 編集

function save(index){ console.log(save_data); save_data["num"]=num; var index_data=index.getAttribute("index");//divのindex属性でどこにデータをセーブさせるか決めさせる console.log(index_data); var save_data2={}; save_data2=save_data; save_file[index_data]=save_data2;/ここで格納 console.log(save_file);//しかし二回目以降は前回入れた値もキーが違うのに上書きされてしまう num++; } 格納させるsave_dataとはまた違う空の配列(save_data2)を作ってsave_fileに格納すればいいということですね? ありがとうございます。
maisumakun

2021/06/30 00:11

> 格納させるsave_dataとはまた違う空の配列(save_data2)を作ってsave_fileに格納すればいいということですね? 上のコードでもそうなっていません。save_data2=save_data;としているので、変数は変わってもオブジェクトは同じものです。
dimyas

2021/06/30 00:19

つまり、save_dataの中身をforなどで一つずつ取り出して空のsave_data2に代入するということですか? さっきのコードも実行してみると、ダメでした...。
dimyas

2021/06/30 00:28

function save(index){ console.log(save_data); save_data["num"]=num; var index_data=index.getAttribute("index"); console.log(index_data); var save_data2=new Object; for(let i=0;i<Object.keys(save_data).length;i++){ save_data2[Object.keys(save_data)[i]]=save_data[Object.keys(save_data)[i]]; } save_file[index_data]=save_data2; console.log(save_file); num++; } こうしたらうまく動きました。 お世話になりました。 本当にありがとうございます。
maisumakun

2021/06/30 00:29

> つまり、save_dataの中身をforなどで一つずつ取り出して空のsave_data2に代入するということですか? それでもいいですが、Object.assignや{...save_data}などでコピーも可能です。
dimyas

2021/06/30 00:33

まだ知らないことが多いですね!! もっと勉強します!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問