131

It's difficult to explain the case by words, let me give an example:

var myObj = {
    'name': 'Umut',
    'age' : 34
};

var prop = 'name';
var value = 'Onur';

myObj[name] = value; // This does not work

eval('myObj.' + name) = value;   //Bad coding ;)

How can I set a variable property with variable value in a JavaScript object?

Pang
  • 9,564
  • 146
  • 81
  • 122
Umut KIRGÖZ
  • 2,105
  • 3
  • 22
  • 29
  • possible duplicate of [How to create object property from variable value in javascript?](http://stackoverflow.com/questions/2241875/how-to-create-object-property-from-variable-value-in-javascript) – Felix Kling Jun 22 '11 at 12:37
  • 5
    Have a close look. It seems you just forgot to adjust cour code. It should be `myObj[prop] = value;`. `eval('myObj.'+name)` does not work either as the variable `name` does not exist. – Felix Kling Jun 22 '11 at 12:37
  • 9
    you should really use more `var` keyboards for declaring variables, use more semicolons, not use `eval` and accept more answers. Done. – jAndy Jun 22 '11 at 12:37
  • 1
    Your question is flawed -- that *does* work, but you made a mistake. You wrote "`myObj[name]`" when I'm quite sure you meant to write "`myObj[prop]`". – Ernest Friedman-Hill Jun 22 '11 at 12:39

7 Answers7

191
myObj[prop] = value;

That should work. You mixed up the name of the variable and its value. But indexing an object with strings to get at its properties works fine in JavaScript.

Matt Greer
  • 60,826
  • 17
  • 123
  • 123
68
myObj.name=value

or

myObj['name']=value     (Quotes are required)

Both of these are interchangeable.

Edit: I'm guessing you meant myObj[prop] = value, instead of myObj[name] = value. Second syntax works fine: http://jsfiddle.net/waitinforatrain/dNjvb/1/

bcoughlan
  • 25,987
  • 18
  • 90
  • 141
7

You can get the property the same way as you set it.

foo = {
 bar: "value"
}

You set the value foo["bar"] = "baz";

To get the value foo["bar"]

will return "baz".

timw4mail
  • 1,716
  • 2
  • 13
  • 16
5

You could also create something that would be similar to a value object (vo);

SomeModelClassNameVO.js;

function SomeModelClassNameVO(name,id) {
    this.name = name;
    this.id = id;
}

Than you can just do;

   var someModelClassNameVO = new someModelClassNameVO('name',1);
   console.log(someModelClassNameVO.name);
Soner Gönül
  • 97,193
  • 102
  • 206
  • 364
4

simple as this myObj.name = value;

Arturo Martinez
  • 3,737
  • 1
  • 22
  • 35
3

When you create an object myObj as you have, think of it more like a dictionary. In this case, it has two keys, name, and age.

You can access these dictionaries in two ways:

  • Like an array (e.g. myObj[name]); or
  • Like a property (e.g. myObj.name); do note that some properties are reserved, so the first method is preferred.

You should be able to access it as a property without any problems. However, to access it as an array, you'll need to treat the key like a string.

myObj["name"]

Otherwise, javascript will assume that name is a variable, and since you haven't created a variable called name, it won't be able to access the key you're expecting.

NT3RP
  • 15,262
  • 9
  • 61
  • 97
  • 1
    There's still a difference between `myObj[name]` and `myObj.name` though, because the former refers to a variable name and the second to a literal key. – pimvdb Jun 22 '11 at 12:52
3

You could do the following:

var currentObj = {
    name: 'Umut',
    age : 34
};

var newValues = {
    name: 'Onur',
}

Option 1:

currentObj = Object.assign(currentObj, newValues);

Option 2:

currentObj = {...currentObj, ...newValues};

Option 3:

Object.keys(newValues).forEach(key => {
    currentObj[key] = newValues[key];
});
anayarojo
  • 1,121
  • 2
  • 19
  • 27