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

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

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

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

Q&A

解決済

1回答

931閲覧

多次元配列において、上の階層を参照する方法

suzunox

総合スコア80

JavaScript

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

0グッド

1クリップ

投稿2019/03/13 08:43

###現在やろうとしていること
HTMLのタグを加工選別し、配列にコピーして、多次元配列によって、そのHTMLの親ノード子ノードを再現するのを目指しています。配列の要素はHTMLのタグのID名にして、多次元配列から直接そのタグにアクセスできるようにしています。
例えば下記のようなHTML文書があったとします。

html

1<math id="math"> 2 <mi id="1">y</mi> 3 <mo id="2">=</mo> 4 <mfrac id="3"> 5 <mrow id="4"> 6 <mn id="6">1</mn> 7 </mrow> 8 <mrow id="5"> 9 </mrow> 10 </mfrac> 11</math>

これを多次元配列で表すと次のようになります。

javascript

1var mathArray = { 2 id: 'math', 3 array: [ 4 '1', 5 '2', 6 { 7 id: '3', 8 argument1: { 9 id: '4', 10 array: ['6'] 11 }, 12 argument2: { 13 id: '5', 14 array: [] 15 } 16 } 17 ] 18}

###出来ないこと
例えば、id="7"のタグを動的に下記の指定したところに入れることが目標とします。

javascript

1var point = mathArray['array'][2]['argument2']['array'][0]

タグを挿入する場合、appendChild()を使うのですが、その時どうしても親ノードを記述しないといけません。親ノードのidは次のようにして参照することが出来ます。

javascript

1var point2 = mathArray['array'][2]['argument']['id']

僕が分からないのは、どうやってpoint変数からpoint2変数のような参照をするかです。
僕が考えたプロセスは、
0. pointから['array'][0]を消す
0. ['id']を付け足す

なのですが、プロセス1のやり方が分かりません。

###僕が考えた不器用なやり方
予め、
var point = ['array', 2, 'argument2', 'array', 0];
と宣言して、for文を使って[]を足していき、最後にFunction()で文字列をメソッドに変換するやり方です。
多分時間がかかるので、もっと時間がかからない方法を探してます。

javascript

1var changeF = function(point) { 2 Faunction(point)(); 3} 4var connect = 'document.getElementById(mathArray'; 5for(var i = 0; i <= point.length - 3; i++) { 6 if(typeof mathArray[i] === 'string') { 7 connect += '["' + mathArray[i] + '"]'; 8 } else { 9 connect += '[' + mathArray[i] + ']'; 10 } 11} 12connect += '["id"]).appendChild(<入れたいElement>);'; 13changeF(connect);

###使用するブラウザ
使用するブラウザはFireFoxです。違うブラウザではMathMLが表示されません。

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

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

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

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

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

kei344

2019/03/13 10:38

「多次元配列」にわざわざする意味が読み取れませんでした。JavaScriptでHTMLを扱う物に「DOM」という物があり、それが既にツリー上になった要素にアクセスする方法を提供しています。idがあるならそこからアクセスして、その親を取得することができます。具体的にどういう処理をするために質問のようなコードを書かれているのでしょう。
suzunox

2019/03/13 11:30

僕が本来作ろうとしていたのは、キーボードで文字を打ち込むことで、MathMLを介して数式を表示してくれる代物です。そして、今カーソルのプログラムを作っています。(マウスカーソルではないほう) 矢印キーを押すと縦線が動くのですが、当然カーソルは点滅していて、ただの"|"を入れるとそこに空間が出来たりなくなったりして、不自然になります。そこで、カーソル自身がいるディレクトリに文字がなかった場合は"|"で、あった場合は<style>に、#~~ {border-right[left]: solid 1px }と記入するようにしました。すると、本来カーソルはどこにあるのかわかりにくくなります。それを明確にするために、配列を施し、その中に'cursor'を忍ばせたわけです。 他にも、カーソルは単にタグ一個分飛び越えて移動するわけではなく、暗黙のタグを無視して飛び越えなくてはなりません。例えば、y=axがあったとして、aとxの間には暗黙の演算子"×"がふくまれています。その要素を無視するのが面倒なので、配列の中に無視する要素を含めないことによって、カーソルの移動をたやすくしようというわけです。 あとほかにもあるのですが、今考えたら、配列を施すより、DOM上でやったほうが早く済むようなきがしてきました。
kei344

2019/03/13 11:38

矢印キーで要素間を移動(カーソルを移動)したい、ということであれば、「現在どこの要素にカーソルが居るのか」の情報があれば問題ないような。カーソルで次の要素は子か兄弟か(DOMで探せば見つかる)、前の要素は親(ルートまで親が必ずある)か兄弟になります。
suzunox

2019/03/13 14:01

なるほど、DOMに関するメソッドも使えそうなものがたくさんありますね。parentElementだけでなく、一つ前の要素や後の要素を取得できるメソッドがあるのを知りました。確かに、DOMで要素を追加してから多次元配列で計算するのがいいですね。 やってみます。最後までありがとうございました。
oikashinoa

2019/03/13 14:03

出来上がったら、自己解決として回答を対処方法をまとめて書き込んで下さい。 少し面倒ですが、考えをまとめるいいチャンスです。
guest

回答1

0

自己解決

多次元配列は上記のようなやり方だとメリットが少ないので、極力控える。
配列で使えたメソッドと同じようなものがDOMでたくさんあるのでそれらを使う。

DOMの様々なメソッド

投稿2019/03/13 14:03

編集2019/03/13 14:09
suzunox

総合スコア80

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問