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

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

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

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

jQuery

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

HTML

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

Q&A

解決済

2回答

3145閲覧

JSオブジェクトのループで上書きされてしまう

murati

総合スコア18

JavaScript

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

jQuery

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

HTML

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

0グッド

0クリップ

投稿2020/10/01 09:40

編集2020/10/01 09:57

###実現したいこと
HTMLのチェック状態を取得して、次のオブジェクトを得たいです

js

1resuts = { 2 "apple" : {"xxx":true, "yyy":false } , 3 "banana": {"zzz":true } 4};

###エラー
pushの前にfruits_nameがないと怒られます

Uncaught TypeError: resuts[fruits_name] is undefined

###該当のソースコード

html

1<input type="checkbox" name="apple" data-fruits_name="apple" data-frits_taste="xxx" checked=""> 2<input type="checkbox" name="apple" data-fruits_name="apple" data-frits_taste="yyy"> 3<input type="checkbox" name="banana" data-fruits_name="banana" data-frits_taste="zzz" checked="">

js

1console.log( hoge() ); 2function hoge(){ 3 let resuts = {}; 4 $('input').each(function(i,e){ 5 const fruits_name = $(e).attr('data-fruits_name'); 6 const frits_taste = $(e).attr('data-frits_taste'); 7 const obj = { [frits_taste] : $(e).prop('checked') }; 8 resuts[fruits_name].push(obj); 9 }); 10 return resuts; 11}

###試したこと
エラーに従ってfruits_nameを追加してみたのですが、appleのxxxが得られませんでした。

console.log( hoge() ); function hoge(){ let resuts = {}; $('input').each(function(i,e){ const fruits_name = $(e).attr('data-fruits_name'); const frits_taste = $(e).attr('data-frits_taste'); const obj = { [frits_taste] : $(e).prop('checked') }; resuts[fruits_name] = []; // fruits_nameを追加 resuts[fruits_name].push(obj); }); return resuts; }

こういったときにはどうすべきでしょうか?
宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

まず、英単語を略記するときは 母音(a,i,u,e,o) を省略すると通じやすいです。
resuts は 1つのオブジェクトを取得したいので、単に result(略記するとrslt)でよい。

javascript

1function hoge(){ 2 let rslt = {}; 3 $('input').each(function(i,e){ 4 const fruits_name = $(e).data('fruits_name'); // jQueryの dataAPI で参照可 5 const frits_taste = $(e).data('frits_taste'); 6 const obj = { [frits_taste] : $(e).prop('checked') }; 7 8 // jquery を用いて HTML から取得した値を確認 9 console.log( fruits_name, frits_taste, $(e).prop('checked'), obj ); 10 // i==0 : "apple" "xxx" true Object { xxx: true } 11 // i==1 : "apple" "yyy" false Object { yyy: false } 12 // i==2 : "banana" "zzz" true Object { zzz: true } 13 14 //rslt[fruits_name].push(obj); // 配列を処理しようとしている 15 if( !relt.hasOwnProperty(fruits_name) ) { 16 // プロパティが無いときは新規に付与 17 rslt[fruits_name] = obj; 18 } 19 else { 20 // プロパティが有るときは、値のオブジェクトを合成 21 Object.assign( rslt[fruits_name], obj) 22 } 23 }); 24 return rslt; 25} 26let oj = hoge() 27console.log( oj ); 28// => 求めるオブジェクト 29 30console.log( JSON.stringify(oj) ); 31// => JSON で 送受信できる文字列に

こういったときにはどうすべきでしょうか?

  1. 回答のコードにも残していますが、console.log() を用いて値をしっかり把握すること

(確認数が多い場合、log=[]のような配列に入れて console.table() も活用します)。
2. 反復処理で操作したい対象は、配列なのか、オブジェクトなのかを失念しないこと
rslt = {} と初期化しているので、オブジェクトの操作です)。

投稿2020/10/01 14:15

編集2020/10/01 14:42
AkitoshiManabe

総合スコア5432

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

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

murati

2020/10/01 23:37

ありがとうございます。知らないメソッドや細部のテクニックなど大変勉強になりました。
guest

0

javascript

1resuts = { 2 "apple" : {"xxx":true, "yyy":false } , 3 "banana": {"zzz":true } 4};

JSON形式で書くときキー項目は「"」で囲いましょう。
あと配列でないなら「[]」もいりません。

javascript

1console.log(resuts["apple"]["xxx"]); 2console.log(resuts["apple"]["yyy"]); 3console.log(resuts["banana"]["zzz"]);

追記
質問者様がしたい事(ほしい結果)はこれで合っていますか?
(複数回実行想定の処理が無かったので一応追加)

javascript

1console.log( hoge() ); 2function hoge(){ 3 let resuts = {}; 4 $('input').each(function(i,e){ 5 const fruits_name = $(e).attr('data-fruits_name'); 6 const frits_taste = $(e).attr('data-frits_taste'); 7 // const obj = { [frits_taste] : $(e).prop('checked') }; 8 if (!(fruits_name in resuts)) { // 親要素の存在チェック 9 resuts[fruits_name] = []; // 親要素の初期化 10 } 11 if (!(frits_taste in resuts[fruits_name])) { // 子要素の存在チェック 12 let obj = {}; // 子要素の設定 13 obj[frits_taste] = $(e).prop('checked'); // 子要素に値を設定 14 resuts[fruits_name].push(obj); // 親要素に子要素を追加 15 }else{ 16 resuts[fruits_name][frits_taste] = $(e).prop('checked') // 子要素に値を追加 17 } 18 console.log(resuts["apple"]["xxx"]); // 確認用にコンソールに出力 19 }); 20 return resuts; 21}

投稿2020/10/01 09:50

編集2020/10/01 14:50
kuma_kuma_

総合スコア2506

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

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

murati

2020/10/01 09:57

失礼しました。ご指摘の点修正しました。
kuma_kuma_

2020/10/01 10:07

> 配列でないなら「[]」もいりません。 多分ここも直してないでしょう > const obj = { [frits_taste] : $(e).prop('checked') }; は > const obj = { frits_taste : $(e).prop('checked') };
murati

2020/10/01 11:03

それですとキー名が「frits_taste 」になってしまいます。frits_taste は変数です。
kuma_kuma_

2020/10/01 11:10

> let obj = {}; > obj[frits_taste] = $(e).prop('checked'); それならこっちで書いたら?
murati

2020/10/01 11:15

コードレビューはありがたいのですが…
kuma_kuma_

2020/10/01 11:24

正直いうとね質問者様の 「JSオブジェクトのループで上書きされてしまう」と ソースコードの内容と やりたいことの内容が全部バラバラなんです。 その為正確な答えが出せなくてこうではないか?という仮説で書かないといけない状態です。 適当に答えてるように見えるかもしれませんが一つづつうまくいかない可能性を つぶしていっているのですよ?
murati

2020/10/01 12:03

実現したいことは「HTMLのチェック状態を取得して、次のオブジェクトを得たいです」だけですので…
kuma_kuma_

2020/10/01 12:22

うんじゃ説明しておくと まずタイトル「JSオブジェクトのループで上書きされてしまう」となっているが 質問者様の内容からすると「HTMLのチェック状態を取得して、JSONオブジェクトを得たいです」が正しいよね? 次に得たい「JSONオブジェクト」を書いたまでは良かったんだけど書き方がまずかった(JSON形式ではなかった)※ 1回目の指摘ね その為JSON形式は配列でほしいのか連想配列でほしいのかわからなくなってしまいました。 ※ 2回目の指摘ね さらに固定文字でほしいのか変数に入っている値で登録したいのかわからない ※ 3回目の指摘ね という順番に聞いているわけだ。 回答に再度追記するけどこれが質問者様がしたかったこと?
murati

2020/10/01 12:43

>回答に再度追記するけどこれが質問者様がしたかったこと? いいえ…
kuma_kuma_

2020/10/01 13:22

あとは「チェック」したときに値を取得しておきたいぐらいしか内容が思いつかないんだけれども? (こちらではresutsに意図した形式でデータが入っている事は確認しています。) なにが違いますか?
kuma_kuma_

2020/10/01 14:52 編集

> HTMLのチェック状態を取得して、次のオブジェクトを得たいです 取得できることを確認 > pushの前にfruits_nameがないと怒られます これに関しても対策済み > appleのxxxが得られませんでした。 判りやすくconsole.logを追加しておきます。 > resuts がグローバル変数で2回目以上実行した場合 想定して処理を追加しました。 判りやすくコメント追加しておきました。やりたいことはなんですか? ・連想配列ではなく配列でほしい。 ・clickした際の更新したい。 ・取得した値を後から使いたい。 あと思いつくのはこれぐらいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問