JavaScript - cannot set property of undefined

Javascript

Javascript Problem Overview


My code:

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

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

console.debug (d);

I get the following error: >Uncaught TypeError: Cannot set property 'greeting' of undefined.

I'm trying to do something similar to an associative array. Why isn't this working?

Javascript Solutions


Solution 1 - Javascript

you never set d[a] to any value.

Because of this, d[a] evaluates to undefined, and you can't set properties on undefined.

If you add d[a] = {} right after d = {} things should work as expected.

Alternatively, you could use an object initializer:

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

Or you could set all the properties of d in an anonymous function instance:

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

If you're in an environment that supports ES2015 features, you can use computed property names:

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

Solution 2 - Javascript

You have to set d[a] to either an associative array, or an object:

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

Without setting, this is what's happening:

d[a] == undefined, so you're doing undefined['greeting']=b; and by definition, undefined has no properties. Thus, the error you received.

Solution 3 - Javascript

The object stored at d[a] has not been set to anything. Thus, d[a] evaluates to undefined. You can't assign a property to undefined :). You need to assign an object or array to d[a]:

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

console.debug(d);

Solution 4 - Javascript

In javascript almost everything is an object, null and undefined are exception.

Instances of Array is an object. so you can set property of an array, for the same reason,you can't set property of a undefined, because its NOT an object

Solution 5 - Javascript

i'd just do a simple check to see if d[a] exists and if not initialize it...

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);

Solution 6 - Javascript

In ES6 you can use the spread operator, if d[a] is undefined it will just ignore, but if it has content it will keep it

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

The accepted answer will override anything in d, which is not the behaviour we would always want

Solution 7 - Javascript

> d = {} is an empty object right now. > > > And d[a] is also an empty object.

It does not have any key values. So you should initialize the key values to this.

d[a] = {
greetings:'',
data:''
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStackOverflowNewbieView Question on Stackoverflow
Solution 1 - JavascriptzzzzBovView Answer on Stackoverflow
Solution 2 - Javascriptvol7ronView Answer on Stackoverflow
Solution 3 - JavascriptPolaris878View Answer on Stackoverflow
Solution 4 - JavascriptwukongView Answer on Stackoverflow
Solution 5 - JavascriptiohzrdView Answer on Stackoverflow
Solution 6 - JavascriptShadowebView Answer on Stackoverflow
Solution 7 - JavascriptNikhil YadavView Answer on Stackoverflow