根据另一个数组的值设置数组中键的值

时间:2016-09-13 14:45:09

标签: javascript arrays json

我附上了一个我正在努力完成的工作概念的编解码器(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,以及我缺少什么?

2 个答案:

答案 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]));

Object assign documentation