我附上了一个我正在努力完成的工作概念的编解码器(http://codepen.io/anon/pen/PGkQmq)。此工作代码根据defaultNameArray中的相应位置为JSON对象中的name键的null值指定名称。
我的问题在于我尝试在代码中生成defaultOdj数组的代码,其长度等于defaultNameArray。
var defaultNameArray = ["Bob", "Alice", "Joe"];
var defaultObj = [
{
"name": null,
"age": "32",
"height": "175",
"etc": "someData",
},
];
for (var i = 0; i < defaultNameArray.length -1; i++) {
defaultObj.push(defaultObj[0]);
}
for (var i = 0; i < defaultObj.length; i++) {
defaultObj[i].name = defaultNameArray[i];
console.log("defaultObj[i].name: " + defaultObj[i].name);
console.log("defaultNameArray[i]" + defaultNameArray[i]);
};
var str = JSON.stringify(defaultObj);
console.log('defaultObj: ' + str);
此代码生成一个通用数组,然后我应该能够迭代为一个键赋值,相对于另一个数组中的位置(名称)。最终结果是所有名称都是“Joe”,即names数组中的最后一个位置。为什么迭代生成的JSON数组的行为与使用代码中定义的类似,如附加的codepen,以及我缺少什么?
答案 0 :(得分:2)
您将同一个对象defaultObj[0]
一次又一次地推送到数组中。如果你改变了那个对象,那么无论你从哪个数组索引看,都会看到这种变化。它是一样的单一对象。如果您更改defaultObj[0].name
,则更改defaultObj[1].name
:这是相同的事情。
因此,您需要复制(克隆)您的对象。为此,您可以使用Object.assign
执行浅层复制 - 足以满足您的需要:
变化:
defaultObj.push(defaultObj[0]);
为:
defaultObj.push(Object.assign({}, defaultObj[0]));
var defaultNameArray = ["Bob", "Alice", "Joe"];
var defaultObj = [
{
"name": null,
"age": "32",
"height": "175",
"etc": "someData",
},
];
for (var i = 0; i < defaultNameArray.length -1; i++) {
defaultObj.push(Object.assign({}, defaultObj[0]));
}
for (var i = 0; i < defaultObj.length; i++) {
defaultObj[i].name = defaultNameArray[i];
console.log("defaultObj[i].name: " + defaultObj[i].name);
console.log("defaultNameArray[i]" + defaultNameArray[i]);
};
var str = JSON.stringify(defaultObj);
console.log('defaultObj: ' + str);
答案 1 :(得分:1)
defaultObj.push(defaultObj[0]);
这会使用它对数组的引用推送同一个对象,因此当您更改其中一个属性时,您将更改所有属性。这就是为什么最后他们只拥有最后一个元素的价值。
尝试defaultObj.push(Object.assign({}, defaultObj[0]));