2013-03-22 163 views
1

我有一个JavaScript对象,我将它用作具有键值对的映射类型。将新属性添加到对象

这个地图的人口当值从控制器注入到它发生:

var people = {"2":"Brad","3":"Antonio","5":"Stacy","6":"Marry","1":"Jim"} 

我想创建一个新的对象,但在伪代码一个条目即

var new_people = people + {11: "John"} 

我试着首先再复制人新人:

new_people.\"11\" = "John" 

new_people."11" = "John" 

两者都产生故障。虽然任何字符串,而不是作品数量即

new_people.anystring = "John" 

var new_people = {"2":"Brad","3":"Antonio","5":"Stacy","6":"Marry","1":"Jim", "anystring":"John"} 
+1

这不是真的,任何字符串都可以工作。 '1string'是一个字符串,但'new_people.1string'不起作用。 – 2013-03-22 13:26:08

+0

[如何使用javascript访问任何元素,如果elemet有特殊字符]可能的重复(http://stackoverflow.com/questions/12953704/how-to-access-any-element-using-javascript-if-elemet -is-having-special-characte)和[克隆JavaScript对象的最有效方法是什么?](http://stackoverflow.com/q/122102/218196)。 – 2013-03-22 13:32:12

+1

在你的例子'new_people.anystring =“John”中,'anystring'是一个字符序列,但它不是JavaScript数据类型意义上的字符串。它是一个*标识符名称*。 – 2013-03-22 13:35:11

回答

6

你可以使用索引:

new_people['11'] = 'John'; 
2

你只需要添加一个键值对象:

people['11'] = "John"; 

如果关键是一个有效的标识符名称(不是数字),你可以使用这个:

people.key = "John"; 

你必须使用索引时,它不是一个有效的变量名:

people["~!#$#$#HV"] ="some value"; 
2

你将有一个问题,因为变量存储对象时保持引用。通过变异new_people,你也在变异人。

var people = {"1":"James"} 
console.log(people);  // Object {1: "James"} 
var new_people = people; 
new_people["2"] = "Jimmy"; 
console.log(people);  // Object {1: "James", 2: "Jimmy"} 
console.log(new_people); // Object {1: "James", 2: "Jimmy"} 

您需要首先克隆该对象,然后改变该克隆,以便不影响原始对象。

一个简单的方法来做到这一点是使用underscore.js延长()方法是这样的:

var new_people = _.extend({}, people, {"2": "Jimmy"}); 
console.log(people);  // Object {1: "James"} 
console.log(new_people); // Object {1: "James", 2: "Jimmy"} 

或类似的,具有jQuery延长()这样的:

var new_people = $.extend({}, people, {"2": "Jimmy"}); 
console.log(people);  // Object {1: "James"} 
console.log(new_people); // Object {1: "James", 2: "Jimmy"} 
+0

Yup:问题中的'var new_people = people + {11:“John”}'行不会创建新对象。 (它实际上创建了一个字符串。) – 2013-03-22 13:46:39

+0

@PaulD.Waite OP表示'var new_people = people + {11:“John”}'是伪代码。 – 2013-03-22 14:52:42

+0

@JeffShaver:啊,是的,我明白了。没有注意到这一点。 – 2013-03-22 15:53:15

0

@Gandalf StormCrow这里是一个代码:jsfiddle

var people = {"2":"Brad","3":"Antonio","5":"Stacy","6":"Marry","1":"Jim"}; 

var newpeople = {"11": "John"}; 
jQuery.extend(people, newpeople); 
//Now: people = {"2":"Brad","3":"Antonio","5":"Stacy","6":"Marry","1":"Jim","11": "John"} 

for(var i in people){ 
    alert(people[i]); 
};