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

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

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

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

Q&A

解決済

2回答

1482閲覧

javascriptの連想配列のプロパティに他の配列名をセット

退会済みユーザー

退会済みユーザー

総合スコア0

JavaScript

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

0グッド

0クリップ

投稿2017/04/22 19:19

タイトルの通りjavascriptの連想配列のプロパティのところに他の配列名をセットし、連想配列[プロパティ]でその配列を呼び出すことってできないでしょうか。

これをしたいと思う理由なのですが、
以下のようなイメージの3次元配列を作りたいのです。
3次元目の配列a,b,c,d,e,f,gにはそれぞれ100個の要素が入っており、
それが別々にA,B,Cという配列に入っており
それがAAAという配列に入っています。
イメージ説明

本来は次元は3のままで、Aやaのあたりの配列数が倍くらいあるかなり大規模な3次元配列を作りたいと思っているのですが、これをそのまま1つのファイルに書いてしまうと、だいぶ見栄えが悪く、可読性も下がる気がしてなりません。

そこでAというファイルの中にa,bの配列、
Bというファイルの中にc,dを記述します。

また、ユーザーにselectのoptionで選択されたvalueを取得していき、
「AAA」→「A」→「b」
と入力されたら「AAAAb」のような文字列を作り,
それをkeyとしている連想配列のプロパティにaの配列をセットしておくことでaを呼び出すという風にしたいと思っています。

javascript

1var 連想配列 ={ 2 "AAAAb": b(の配列), 3 "AAABc": c(の配列), 4 "AAABd": d(の配列), 5 "AAACe": e(の配列) 6};

このままでは
連想配列[AAAAb]としてもただの文字列「b」が表示されると思いますが、
ここで配列bの中身を表示させたいのです。

・タイトルのようなことはできるのか
・これを実現するための他のアイデアはあるか

あたりを教えて頂けるとうれしいです。
よろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

オブジェクト初期化子

オブジェクト初期化子({})や配列初期化子([])は値に変数名を使えるので、各外部スクリプトでグローバル変数を宣言すれば、別の外部スクリプトから変数を参照する事は可能です。

JavaScript

1var a = ['a1','a2','a3','a4']; // a.js 2var b = ['b1','b2','b3','b4']; // b.js 3var c = ['c1','c2','c3','c4']; // c.js 4var d = ['d1','d2','d3','d4']; // d.js 5var e = ['e1','e2','e3','e4']; // e.js 6var f = ['f1','f2','f3','f4']; // f.js 7var g = ['g1','g2','g3','g4']; // g.js 8 9// AAAA.js 10var AAAA = { // オブジェクト初期化子(連想配列ではない) 11 'AAAAa': a, 12 'AAAAb': b, 13 'AAABc': c, 14 'AAABd': d, 15 'AAACe': e, 16 'AAAAf': f, 17 'AAAAg': g 18};

ただし、データが大規模になってくるのなら配列初期化子の内容を手動で書き換えるのは手間なので、

  • DBを参照してJSONを出力させる
  • a.txt, b.txt, ...,g.txt を参照してJSONを出力させる

のように、何らかの機械的な機構を作っておくと、より管理しやすいと思います。

連想配列

オブジェクト初期化子({})を「連想配列」と表現していらっしゃいますが、オブジェクト初期化子は配列ではないので厳密にはその表現は正しくありません(よって、三次元配列でもありません)。
他の人に「この三次元配列を...」と説明すると誤解を招くのでご注意ください。

ノード

図面では Node とありますが、DOMノードのような機能を求めている場合にはオブジェクト初期化子だけでは足りない機能があります。
parentNode で親ノードを辿ることが出来なければ、nextSiblingpreviousSibling も使えません。
また、オブジェクト初期化子のプロパティには順番の概念がないので定義順で列挙する事も出来ません。
順番に関しては new Map がほぼオブジェクト初期化子の上位互換なので導入を検討してみるのも良いかもしれません。
parentNode の実装は Node と同じような Interface を独自実装する必要があります(具体的には参照関係を裏側で保持しておく必要がありますね)。

Re: cloudspider さん

投稿2017/04/23 01:52

編集2017/04/23 01:53
think49

総合スコア18164

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

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

0

読解できていないので外している気もしますが、あったらオブジェクトから拾ってなかったら外部から読み込んでAAAAに繋げる、とかでしょうか。

また、100*100要素くらいなら丁寧に書けば可読性に問題が出る量じゃない気もします。

JavaScript

1var AAAA = { 2 A : { 3 a : [ 1, 100 ] 4 , b : [ 1, 100 ] 5 } 6 , B : { 7 c : [ 1, 100 ] 8 , d : [ 1, 100 ] 9 } 10 , C : { 11 e : [ 1, 100 ] 12 , f : [ 1, 100 ] 13 , g : [ 1, 100 ] 14 } 15}; 16console.log( AAAA.A.a[ 0 ] ); // 1 17 18function get_A ( key, callback ) { 19 let obj = AAAA; 20 for ( let i = 0, l = key.length; i < l ; i++ ) { 21 if ( !obj[ key[ i ] ] ) { 22 read_file( key, i, function ( value ) { get_A ( key, callback ); } ); 23 } else if ( l === i + 1 ) { 24 callback( obj[ key[ i ] ] ); 25 } else { 26 obj = obj[ key[ i ] ]; 27 } 28 } 29} 30get_A( [ 'A', 'a', 1 ], function ( value ) { 31 console.log( value ); // 100 32} ); 33 34function read_file ( key, i, callback ) { 35 // 外部から読み込んでAAAAに繋げる 36} 37```**動くサンプル:**[https://jsfiddle.net/gqhrg8Lp/](https://jsfiddle.net/gqhrg8Lp/)

投稿2017/04/22 19:52

kei344

総合スコア69407

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問