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

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

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

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

jQuery

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

Q&A

解決済

1回答

827閲覧

jQueryオブジェクトが勝手に置き換わる

torakun

総合スコア6

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2020/09/12 02:47

前提・実現したいこと

質問よろしくお願い致します。
以下jQueryにおいて、オブジェクトが勝手に置き換わる原因と解決策を知りたいです。

発生している問題・エラーメッセージ

以下 postArgs を見ると、apple の kind に b が二つ入ってしまいます。
ここは a と b を入れたいです。
(画像のように置き換わることなく、postArg の値を postArgs に入れたいです。)

該当のソースコード

実行サンプル:https://jsfiddle.net/o1uyLkxv/

jQuery

1console.log('start'); 2 3const filterd = { 4 "apple" : ["a","b"], 5 "banana": ["d"], 6 "cherry": ["e", "f"], 7 "durian": ["g","h"] 8}; 9 10let postArgs = []; 11$.each(filterd, function(service, kinds) { 12 let postArg = {}; 13 kinds.forEach( kind => { 14 postArg.service = service; 15 postArg.kind = kind; 16 postArg.word = 'あ'; 17 console.log( 'postArg =', postArg ); 18 postArgs.push( postArg ); 19 }); 20}); 21 22console.log( 'postArgs =', postArgs ); 23 24console.log('finish');

試したこと

上記のようにコンソールを出し、postArgs 手前の postArg を個別に出しました。画像の通りです。
すると、その時点では a になっているのに、postArgs の時点で勝手にbに置き換わるという現象なのだとわかりました。
しかし、コンソールと push の間にはなんの処理もないために、なぜ勝手に置き換わるのか…全く分からないです。
コンソールに表示されている postArg が push される。という理解なのですが、何か間違っているのでしょうか?
イメージ説明

さらに、よりシンプルに以下状況での再現を試みましたた。
ですが、これはきちんと a と b が入りまして、原因を探る手立てが見つけられません。

こちらの皆様のお知恵を拝借できましたら幸いです。

jQuery

1let postArgsTest= []; 2for(var i=0; i<2; i++){ 3 let postArg = {}; 4 if( i === 0 ){ 5 postArg = { service: "apple", kind: "a", word: "あ" }; 6 }else{ 7 postArg = { service: "apple", kind: "b", word: "あ" }; 8 } 9 postArgsTest.push(postArg); 10} 11console.log( 'postArgsTest =', postArgsTest ); 12

補足情報(FW/ツールのバージョンなど)

jQuery3.4.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

postArg を宣言するスコープを見直してください

なぜ勝手に置き換わるのか…全く分からないです

置き換わる原因は、配列 postArgs に格納するオブジェクトが kinds.forEach() の外で宣言されているため、常に同一のオブジェクトを参照しているためです。

javascript

1let postArgs = []; 2$.each(filterd, function(service, kinds) { 3 //let postArg = {}; 4 kinds.forEach( kind => { 5 let postArg = {}; 6 postArg.service = service; 7 postArg.kind = kind; 8 postArg.word = 'あ'; 9 console.log( 'postArg =', postArg ); 10 postArgs.push( postArg ); 11 }); 12});

kinds.forEach() 内で console.log() による確認を終えたら、以下のように調整できます

javascript

1let postArgs = []; 2$.each(filterd, function(service, kinds) { 3 kinds.forEach( kind => { 4 postArgs.push( {service, kind, word: "あ"} ); 5 }); 6}); 7console.log( postArgs ); //

投稿2020/09/12 02:59

AkitoshiManabe

総合スコア5434

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

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

torakun

2020/09/12 03:22

ああ…!なるほど。言われてみれば確かにといった感じですが、8時くらいからずっとハマっていたので本当に助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問