オブジェクトのキーにスペースがあるJavaScriptオブジェクトにアクセスするにはどうすればよいですか?


112

次のようなJavaScriptオブジェクトがあります。

var myTextOptions = {
  'cartoon': {
     comic: 'Calvin & Hobbes',
     published: '1993'
  },
  'character names': {
    kid: 'Calvin',
    tiger: 'Hobbes'
  }
}

cartoon簡単に使用しmyTextOptions.cartoon.comicたり、何でもプロパティにアクセスできます。ただし、にアクセスするための正しい構文を取得できませんでしたkid。私は運が悪くて次のことを試しました:

myTextOptions.character names.kid
myTextOptions."character names".kid
myTextOptions.character\ names.kid
myTextOptions.'character names'.kid
myTextOptions.["character names"].kid
myTextOptions.character%20names.kid

Google Chromeでは、要素の検査に移動し、jsonファイルデータセットにカーソルを合わせると、個々のデータセットにツールパスが表示され、そのパスが示されます。また、パスをクリップボードにコピーするオプションも表示されます。参考までに。
Simon Suh

すばらしい答えです。しかし、最後のオプションは私にはうまくいきませんでした。
ダニエルバンデイラ

詳細... myTextOptions.character%20n.kidと入力すると、「NaN」が返されます。最後のプロパティ名(子供)は関係ありません。他の名前にする必要があります。Debian 9でFireFox Quantum 8.3.0esr(64ビット)を使用しています
Daniel Bandeira

回答:


231

ECMAscriptの「ブラケット表記」を使用します。

myTextOptions[ 'character names' ].kid;

この表記は、読み書きどちらでも使用できます。

詳細については、こちらをご覧ください。


2
julioはOPで既に使用を試みたと述べていますmyTextOptions.["character names"].kid-この質問を完全にするために、なぜそれがうまくいかないのか疑問に思いましたか?
James_F 2017

7
@James_F彼もdot notation同時に使用したため。アクセサディレクティブは1つだけ存在する必要があります。
jAndy 2017

2
ああ、はい、申し訳ありませんでした-かっこよく見えたので、ブラケットの前に余分なドットがありませんでした!-ありがとう
James_F

オブジェクトキーでスペースを使用するのが良いか悪いかについて誰かが知っていますか?
ファンP.オルティス

1
@ JuanP.Ortiz、typescriptを使用している場合、これは良い方法ではありません。typescriptのコンパイルチェックが失われます。
Rosdi Kasim

4

JavaScriptオブジェクトのプロパティは、ブラケット表記を使用してアクセスまたは設定することもできます(詳細については、プロパティアクセサーを参照してください)。各プロパティは、アクセスに使用できる文字列値に関連付けられているため、オブジェクトは連想配列と呼ばれることがあります。したがって、たとえば、次のようにmyCarオブジェクトのプロパティにアクセスできます。

myCar['make'] = 'Ford';
myCar['model'] = 'Mustang';
myCar['year'] = 1969;

詳細については、JSオブジェクトの操作を参照してください

だからあなたの場合それは myTextOptions['character names'].kid;


2

これを行うこともできます-

myTextOptions[ 'character names' ]['kid'];

これは、スペースで構成される連続したキーがある場合に便利です。


0

ここで私の解決策を共有しましょう。私はタイプスクリプトでVueJを使用しています。

私はjsonに従ってUIを解析して表示しました

 {
    "Brand": "MAMA",
    "Variety": "Instant Noodles Coconut Milk Flavour",
    "Style": "Pack",
    "Country": "Myanmar",
    "Stars": 5,
    "Top Ten": "2016 #10"
  },

Typescriptで干渉する次のモデルを作成しました

export interface Resto {
    Brand: string;
    Variety: string;
    Style: string;
    Country: string;
    Stars: any;
    Top_Ten: string;
    }

私はAPIを次のように呼び出しました:

   public async getListOfRestos() {
    return (await fetch(
      `http://starlord.hackerearth.com/TopRamen`,
      {
        method: "get",
        credentials: "include",
        headers: {
          "Content-Type": "application/json",
        },
        body: undefined
      }
    )) as IFetchResponse<Resto[]>;
  } 

次のようなJSXで使用されます。

 <div class="parent" v-for="(x,i) in listOfRestos" :key="i">
      <div>{{x.Brand}}</div>
      <div>{{x.Variety}}</div>
      <div>{{x.Style}}</div>
      <div>{{x.Country}}</div>
      <div>{{x.Stars}}</div>
      <div>{{x['Top Ten']}}</div>
  </div>

同じことがReactとAngularでも機能します。


0

このコードを使用

myTextOptions.["character names"]["kid"];


端的に言えば簡潔ですが、新しいjsユーザーは質問の背後にある理論的根拠を理解していない可能性があります。
バッタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.