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

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

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

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

Q&A

解決済

2回答

1545閲覧

JavaScriptにて配列を呼び出し関数を実行したい

ma_ya

総合スコア7

JavaScript

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

1グッド

0クリップ

投稿2018/03/19 09:59

前提・実現したいこと

そもそも実現できないかもしれないのですが、配列を呼び出して関数を実行させたいです。
キー値を指定した配列を呼び出したときに、定義していた関数を実行し、配列のキーを引数として関数に渡し、関数の戻り値を返したいというのが実現したいことになります。

例としては、以下のような内容になります。

JavaScript

1// 配列の呼び出し(変更不可) 2var ret = ary[key]; // ←でary関数をコールしたい(事情があり改変ができません) 3console.log(ret); 4 5// 配列に該当する関数(変更可) ←配列の呼び出しでこの関数をコールさせたい 6function ary(key){ // ←の引数keyには配列aryのkeyの内容を格納したい 7 // 処理を行う関数をコール 8 return hoge(key); 9} 10 11// 処理を行う関数(変更不可) 12function hoge(key){ 13 // 実際はkeyを元に処理した結果を返す予定です 14 return "キー値は"+key; 15}

試したこと

・上記コードのように配列と関数名を同じにしたが、当たり前のように関数はコールされなかった
・配列内に関数を格納してみたが指定した配列の関数をコールする形になるため希望と違った

配列を呼び出して関数を実行し、配列のキー値を引数として渡すことが、おかしいとは思いますが、もし良い手段があればお教え頂けると助かります。

よろしくお願い致します。

defghi1977👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

ちょっと何をしたいのか分からないですが、Proxyを使ってみてはどうでしょうか。
Proxy - JavaScript | MDN

js

1var ary = [100,200,300]; 2var target = ary; 3var ary = new Proxy(target, { 4 get: function (target, key){ 5 // 処理を行う関数をコール 6 return hoge(key); 7 } 8}) 9 10// 処理を行う関数(変更不可) 11function hoge(key){ 12 // 実際はkeyを元に処理した結果を返す予定です 13 return "キー値は"+key; 14} 15 16 17 18var key = 0; 19var ret = ary[key]; 20console.log(ret); 21// キー値は0

もちろん、aryでは普通に配列を参照することができなくなりますが……

投稿2018/03/19 10:14

Lhankor_Mhy

総合スコア36134

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

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

ma_ya

2018/03/19 10:57

すごい!!!できました!!!ありがとうございました!!! 参考に頂いたコードそのままでいけました。 元々、静的に記述された配列を読んで処理していた箇所を、新たに関数化して処理することになり、配列の呼び出しているコードが変更不可でしたので、配列の呼び出し方のまま関数が叩けるのかを苦悩していました。説明が下手で申し訳ないです。 勉強になりました。ありがとうございました。
Lhankor_Mhy

2018/03/19 11:02

水を差すようで申し訳ないのですが、Proxy はブラウザ対応に難があります。 たいていの場合は、Babel通してpolyfillで何とかなるものなのですが、私見ですが、Proxyの完全なpolyfillは作れないと思います。   IE11などに対応する必要がないのであればいいのですが…… そうでないなら、BAを外して他の方の回答をお待ちください。
Lhankor_Mhy

2018/03/19 11:27

さらに補足すると、配列で使える全てのメソッドやプロパティも壊します。 たとえば、ary.length は、配列の長さではなく "キー値はlength" を返します。 for ループなどで参照をしているなら、まともに動かないと思います。どうぞ、よくご確認の上、ご使用ください。
ma_ya

2018/03/19 12:09

なるほど、フォローするブラウザやProxy等確認してみます。 ありがとうございました。
ma_ya

2018/03/20 01:58

以下、Proxy使ったバージョンにてブラウザで確認した結果を載せておきます。 ●Windows 10 Ie11 NG Edge NG Firefox OK Chrome OK ●Mac High Sierra Safari OK Firefox OK Chrome OK 今回はIEも対応が必要でしたので、配列形式で読み込んでいた場所を全部関数でコールするよう回収することになりました。 お手数おかけしました。ありがとうございました。
Lhankor_Mhy

2018/03/20 02:45

お疲れ様でした。 IE対応する抜け道がないこともないかとは思いますが、おそらくバグの温床になりますし、それが一番無難かと思います。
guest

0

const key = Symbol('key'); Object.defineProperty(Array.prototype, key, { value: function (index) { return "キー値は" + index; } }); const arr = ['a', 'b', 'c']; arr[key](2) // => 'キー値は2'

指定されている制約違反にだいぶなってると思いますが、こんなのとか。
というか何をしたいのか分かっていません。

投稿2018/03/19 10:30

編集2018/03/19 11:05
HayatoKamono

総合スコア2415

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

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

ma_ya

2018/03/19 11:00

すいません。元々、静的に記述された配列を読んで処理していた箇所を、新たに関数化して処理することになり、配列の呼び出しているコードが変更不可でしたので、配列の呼び出し方のまま関数が叩けるのかを苦悩していました。そういう部分で制約がありました。説明が下手で申し訳ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問