🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

Q&A

解決済

1回答

1887閲覧

JSONの中で変数を使いたい

hukurikousei

総合スコア5

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

JavaScript

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

jQuery

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

0グッド

0クリップ

投稿2019/12/16 21:48

前提・実現したいこと

JSONで簡単な翻訳リストを作っています。
翻訳結果に変数を使いたいです。

発生している問題

翻訳結果に変数を使うため、以下 dictionaries1 という変数を、dictionaries2 という関数にしました。

しかし関数では取得が遅くなるではないかという問題が生じました。

この取得について dictionaries1 や dictionaries2 よりも早くしたいのですが、良い方法はありますでしょうか?

該当のソースコード(dictionaries1を使う)

現状の翻訳リストはこうなっております。
dictionaries1 は var で宣言しており、この中の翻訳結果に変数が使えません。

js

1var dictionaries1 = 2{ 3 "buttons": 4 { 5 "a": 6 { 7 "ja" : "送信" 8 ,"en" : "send" 9 }, 10 "b": 11 { 12 "ja" : "取得" 13 ,"en" : "get" 14 } 15 } 16} 17const txt = dictionaries1['buttons']['a']['ja']; 18console.log( txt ); // 「送信」という翻訳結果が取得される

試したこと(dictionaries2を使う)

翻訳結果に変数を使うために思いついたのが、上の dictionaries1 という変数を、下の dictionaries2 のように引数を持つ関数とすることです。

こうして引数 variable に渡したものが翻訳結果に使えるようになりました。

しかし dictionaries1 よりも取得が遅くなってしまったと思い、質問させて頂いた状況です。

js

1var dictionaries2 = function( variable ){ 2const obj = { 3 "buttons": 4 { 5 "a": 6 { 7 "ja" : "送信" 8 ,"en" : "send" 9 }, 10 "b": 11 { 12 "ja" : "取得" 13 ,"en" : "get" 14 } 15 }, 16 "sns": 17 { 18 "twitter": 19 { 20 "ja" : variable + "さんのtwitter" 21 ,"en" : "" 22 } 23 } 24} 25return obj; 26} 27const txt = dictionaries2('鈴木')['sns']['twitter']['ja']; 28console.log( txt ); // 「鈴木さんのtwitter」という翻訳結果が取得される 29

試したこと(dictionaries1とdictionaries3を使う)

続いて、翻訳結果に変数が必要な場合だけ、次のように分ける方法も考えました。

つまり変数が不要な方は従来と一緒で、必要な方だけ関数化しておくという方法です。これなら遅くなるのは最小限で済むと思いました。

ですがまとまりが悪く感じて違和感を覚えます。

js

1// 変数が不要な方 2var dictionaries1 = 3{ 4 /* 略 */ 5} 6const txt = dictionaries1['buttons']['a']['ja']; 7console.log( txt ); // 「送信」という翻訳結果が取得される 8 9// 変数が必要な方 10var dictionaries3 = function( variable ){ 11const obj = { 12 "sns": 13 { 14 "twitter": 15 { 16 "ja" : variable + "さんのtwitter" 17 ,"en" : "" 18 } 19 } 20} 21return obj; 22} 23const txt = dictionaries3('鈴木')['sns']['twitter']['ja']; 24console.log( txt ); // 「鈴木さんのtwitter」という翻訳結果が取得される

以上の経緯から、翻訳結果に変数を使いつつ、早く取得できる方法があればと思いこちらへのご質問とさせて頂きました。

長くなってしまいすみません。もしご協力いただける方がいらっしゃいましたらよろしくお願い致します。

補足情報

事情があって、辞書リストの階層は変更したくないです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは

一案として、ご質問にある variable + "さんのtwitter" の部分を、

"@{person}さんのtwitter"

のように、可変部分を @{person} のような、独自仕様の変数記述を含む文字列にしておいて、取り出した後で置き換えることです。以下、その例です。

const dictionaries = { buttons: { a: { ja: "送信", en: "send" }, b: { ja: "取得", en: "get" } }, sns: { twitter: { ja: "@{person}さんのtwitter", en: "" } } }; console.log(dictionaries.sns.twitter.ja.replace('@{person}', '鈴木')); // => "鈴木さんのtwitter"

@{person} でなくても、置き換えられる部分であることが目視で分かりやすければよいので、 #person%name% などでもかまいません。

上記と考え方は同じですが、@{person} のような独自フォーマットを導入することは避けたいのであれば、よく知られたフォーマットとして

"%sさんのtwitter"

のように、いわゆるprintfの書式化文字列にしておいて、何らかのsprintfライブラリを使うことも考えられます。以下は、そのサンプルです。

参考になれば幸いです。

投稿2019/12/16 22:31

編集2019/12/16 23:13
jun68ykt

総合スコア9058

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

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

hukurikousei

2019/12/21 03:11

頭よすぎますwご返信遅くなりまして大変申し訳ございませんでした。様々な工夫をありがとうございます。
jun68ykt

2019/12/21 03:50

どういたしまして。何かヒントになれば幸いです。
hukurikousei

2019/12/21 05:37

ヒントどころか、どちらの解決策にしようかについて悩めるなんて贅沢です。今回はreplaceにしましたが、それにしてsprintf.min.jsなんてあったんですね。覚えておきます。ご返信ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問