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

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

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

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

Q&A

解決済

5回答

180閲覧

Javascriptのオブジェクトの追加や削除について

fiile

総合スコア16

JavaScript

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

0グッド

0クリップ

投稿2019/08/26 03:40

編集2019/08/26 11:22

Javascript

1function sample(){ 2 var obj = { 3 test1 : 255, 4 test2 : 'テスト2', 5 test3 : ['arr3_1','arr3_2'], 6 test4 : { 7 test4_1 : 'テスト4_1', 8 test4_2 : 'テスト4_2', 9 }, 10 } 11 12 obj['test5'] = 'テスト5' 13 obj['test5'['test5_1']] = 'テスト5_1' 14}

このときテスト5_1のプロパティがundefinedになる理由はなぜでしょうか?
すでにtest5の値が存在するからかと思いましたが、プロパティをtest6にしても同様にundefinedでした。
ご教示のほど、よろしくお願いいたします。

追記

失礼しました。
オブジェクトのキーにさらにキーを設定し階層的に値を持たせたいです。
test4のような形にしたいのですが、すでにtest5の値が存在するときにどのように対処すればよいのかわかりませんでした。

またobj['test5']['test5_1'] = 'テスト5'

上記だとtest5_1が定義されていないプロパティ?でエラーになることを確認しました。
これはtest5の値がすでに代入されているためかと考えましたが、新しいプロパティobj['test6']['test6_1'] = 'テスト6'としても同様にエラーとなります。

そこで下記のように一度test5でオブジェクト初期化をすることで一応エラー回避することが出来ました。

Javascript

1 obj['test5'] = new Object(); 2 obj['test5']['test5_1'] = 'テスト5_1'; 3 obj['test5']['test5_2'] = 'テスト5_2';

###しかし、本来やりたかったのは下記のような処理なのです。

Javascript

1 obj['test5'] = 'テスト5' 2 obj['test5']['test5_1'] = 'テスト5_1' 3 obj['test5']['test5_2'] = 'テスト5_2' 4console.log(obj.test5) 5//test5=テスト5{test5_1=テスト5_1,test5_2=テスト5_2}

テスト5の値をもたせつつテスト5のプロパティに値を追加するのは難しいのでしょうか?

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

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

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

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

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

m.ts10806

2019/08/26 03:44

結局どうしたくてこのコードを組んだのでしょうか
fiile

2019/08/26 10:32

失礼しました。 追記いたしました。 理想としてはあとからオブジェクトにどんどん追加できるようなコードを書きたかったです。
guest

回答5

0

obj['test5'['test5_1']]は、まず先に内側から解釈されます。

'test5'['test5_1']のように文字列へ角括弧で参照をかけることもできますが、文字列の長さまでの整数を除けば、結果はundefinedです。

つまり、全体としては、obj.undefined = 'テスト5_1'と同じになります。

投稿2019/08/26 03:59

maisumakun

総合スコア145184

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

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

fiile

2019/08/27 09:45

ありがとうございます!なぜundefinedなのか理解できてませんでした! おかげではかどります!
guest

0

ベストアンサー

やりたかったのはこういうことでしょうか?
質問追記拝読。提示したコードはそのような動作をしますが、やはりおすすめはしません。

js

1 obj['test5'] = new String('テスト5'); 2 obj['test5']['test5_1'] = 'テスト5_1'; 3 4 alert( obj['test5'] ); 5/* 6テスト5 7*/ 8 9 alert( obj['test5']['test5_1'] ); 10/* 11テスト5_1 12*/

'テスト5'を上書きしてしまいますが、↓これなら無難かと思います。
質問追記にあわせて削除しました。

js

1 obj['test5'] = 'テスト5'; 2 obj['test5'] = { 'test5_1': 'テスト5_1' }; 3 4 alert( obj['test5'] ); 5/* 6[object Object] 7*/ 8 9alert( obj['test5']['test5_1'] ); 10/* 11テスト5_1 12*/

投稿2019/08/26 07:16

編集2019/08/27 02:26
Lhankor_Mhy

総合スコア36115

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

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

fiile

2019/08/27 09:42

ありがとうございます。 上記にてご教示いただいたコードで実現できそうです。 大変助かりました!
guest

0

多分やりたいのは以下かなぁ。test4と同じ構造にしたい?

javascript

1 obj['test5'] = {'test5_1':'テスト5_1'}

元コードを分解してみると・・・

javascript

1 // 元コード 2 obj['test5'['test5_1']] = 'テスト5_1' 3 4 // 分解 5 const TMP = 'test5'['test5_1'] 6 obj[TMP] = 'テスト5_1'

となります。TMPのところは、「'test5'という文字列のオブジェクト(リテラル)のテスト5_1プロパティ」になるんですが、そんなものはないっつーことでundefinedになっちゃいます。
そうするとobj[undefined] = 'テスト5_1'ってなります。Chromeだとこの時のundefinedが文字列に変換されますね。

だから元のあなたの'test5_1'はobj["undefined"]のなかに行っちゃってます。

答えになってるかな・・・

投稿2019/08/26 05:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/08/27 05:35

あ、たぶんファイルとフォルダの関係みたいにしたいんすね。 ただ、ご提示の例みたいのは結論から言うと難しいかなぁ。(ご提示の例だと"test5"が「ファイル兼フォルダ」みたいになっちゃってる) 型が文字列の場合をファイル、型がObjectの場合をフォルダと考えれば、考え方を変えられるかも? obj['test5'] = 'テスト5' // <- ファイル obj['test5'] = {} // <- フォルダ obj['test5']['test5_1'] = 'テスト5_1' // フォルダにファイルを入れてる この考えで、うまくやりたいことを最適化できませんか? 絶対に「test5=テスト5{test5_1=テスト5_1,test5_2=テスト5_2}」じゃなきゃダメ、ってことじゃないですよね!
fiile

2019/08/27 09:43

ありがとうございます!! ファイルとフォルダの関係を意識することでオブジェクトの理解が深まりました!
guest

0

obj['test5'['test5_1']]

ちょっと意味がわからない
test5をキーにさらにオブジェクトを作りたいのでしょうか?

obj['test5'] = 'テスト5'

ですでに文字列が投入されているので、競合します

投稿2019/08/26 03:53

yambejp

総合スコア114839

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

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

fiile

2019/08/27 09:44

エラーの原因がわからなかったので、とても助かりました! ありがとうございます!
guest

0

テスト5の値をもたせつつテスト5のプロパティに値を追加するのは難しいのでしょうか?

javascript

1obj['test5'] = new MyClass();

新しいクラスを作ってMyClassの中でProxyを使えばできると思いますが、初級者が扱う技術ではありません。

投稿2019/08/26 13:25

querykuma

総合スコア777

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

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

fiile

2019/08/27 09:42

ありがとうございます! ただ僕の使ってる環境にクラス構文が備わってないので難しいです…(´;ω;`)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問