JavaScript-未定義のプロパティを設定できません


108

私のコード:

var a = "1",
b = "hello",
c = { "100" : "some important data" },
d = {};

d[a]["greeting"] = b;
d[a]["data"] = c;

console.debug (d);

次のエラーが発生します。

Uncaught TypeError:undefinedのプロパティ 'greeting'を設定できません。

私は連想配列に似た何かをしようとしています。なぜこれが機能しないのですか?


1
d [a]は未定義です。本質的に、d ["1"]は定義されていません
ジョセフ・マリクル、2011

回答:


159

d[a]値を設定することはありません。

このため、はにd[a]評価されundefined、にプロパティを設定することはできませんundefined

d[a] = {}直後に追加するとd = {}、期待どおりに機能するはずです。

または、オブジェクト初期化子を使用することもできます。

d[a] = {
    greetings: b,
    data: c
};

またはd、無名関数インスタンスのすべてのプロパティを設定することもできます。

d = new function () {
    this[a] = {
        greetings: b,
        data: c
    };
};

ES2015の機能をサポートする環境にいる場合は、計算されたプロパティ名を使用できます。

d = {
  [a]: {
    greetings: b,
    data: c
  }
};

これは機能します。パターンは次のとおりです:d = {[a]:{挨拶:b、データ:c}}
robskrob

@robertjewell、良い点、私はES2015表記についてのメモを含めるように更新しました。
zzzzBov 2017

驚くべき説明。
フィザカーン2018

32

d[a]連想配列またはオブジェクトのいずれかに設定する必要があります。

  • d[a] = [];
  • d[a] = {};

設定しないと、これが起こっています:

d[a] == undefinedので、あなたがやっているundefined['greeting']=b;と定義により、undefinedにはプロパティがありません。したがって、受け取ったエラー。


arrayまたはobject。JSには連想配列はありませんがObject、限られた用途では連想配列の ように機能します。
ジェレミーJスターチャー

@JeremyJStarcher:完全に正しく知っておくことが重要ですが、そのレベルの考え方では、JavaScriptには配列がありません。オブジェクトしかない
vol7ron '19

ではない正確に。連想配列には、プログラマーを作動させるJavacriptオブジェクトには当てはまらない側面があります。(真のアソシエイト配列は、キーを文字列にする必要があることによる制限はありません。継承された事前定義プロパティの存在は、もう1つの大きな違いです。)一方、JavaScript配列は、オブジェクトである一方で、数値配列の動作を期待するように動作します。1つは機能の側面で、もう1つは内部実装です。
ジェレミーJスターチャー

6

に保存されd[a]ているオブジェクトは何も設定されていません。したがって、はにd[a]評価されundefinedます。プロパティをundefined:)に割り当てることはできません。オブジェクトまたは配列を以下に割り当てる必要がありますd[a]

d[a] = [];
d[a]["greeting"] = b;

console.debug(d);

2
オブジェクトを割り当てるのに最適:d[a] = {};-数値以外のキーを持つ配列を使用すると、問題が発生する傾向があります。
nnnnnn 2011

5

JavaScriptでは、ほとんどすべてがオブジェクトでnullありundefined、例外です。

のインスタンスArrayはオブジェクトです。同じ理由で配列のプロパティを設定できますが、オブジェクトではないため、未定義のプロパティを設定できませ


3

単純なチェックを行って、d [a]が存在するかどうかを確認し、存在しない場合は初期化します...

var a = "1",
    b = "hello",
    c = { "100" : "some important data" },
    d = {};

    if (d[a] === undefined) {
        d[a] = {}
    };
    d[a]["greeting"] = b;
    d[a]["data"] = c;

    console.debug (d);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.