我在这里考虑了很多关于主题的主题,但解决方案对我来说似乎并不适用。我想我有一些逻辑问题。我的代码非常简单。我有两个数组(第一个包含三个字符串,第二个包含三个日期)
我想要做的就是将第一个字符串存储在第一个数组中,第一个日期存储在对象的第二个数组中。
我在函数theMainFunc()中创建的数组的代码问题是使用每个数组的最后一个索引保存3个对象,而不是像我需要的那样匹配它们。
以下是代码:
var dlcNameList = ['they shall not pass', 'in the name of the tsar', 'apocalypse'];
var dlcReleaseDate = [new Date(2017,2,28), new Date(2017,6,15), new Date(2017,11,25)];
function objectCreator (dlcObject,dlcName,dlcDate) {
dlcObject.name = dlcName;
dlcObject.date = dlcDate;
return dlcObject;
}
function theMainFunc() {
var dlcDetails = {};
var i = 0;
var storage = [];
var x;
for (i; i <= 2; i++){
x = objectCreator(dlcDetails,dlcNameList[i],dlcReleaseDate[i]);
storage[i] = x;
}
return storage; //This returns an array with three "Same" objects. Not what I want to really acheive
}
console.log(theMainFunc())
答案 0 :(得分:1)
你走了(:
注意:您不必在每次迭代时都创建新对象,您可以使用Array#forEach
并将具有已设置属性和键的对象推送到{{ 1}}数组。
result
&#13;
答案 1 :(得分:1)
因为在循环上方声明了dlcDetails
,所以您不小心重用它并更新其值而不是将新对象推送到数组。
另请注意,当您使用对象/数组调用函数或将其设置为另一个对象的属性的值时,您不会传递该对象的副本,而是共享该对象,以便调用者看到对它的修改。你可能会看到这被称为“通过引用传递”,但这有点用词不当。
function theMainFunc() {
var storage = [];
for (var i = 0; i <= 2; i++){
var dlcDetails = {};
var x = objectCreator(dlcDetails,dlcNameList[i],dlcReleaseDate[i]);
storage[i] = x;
}
return storage;
}
答案 2 :(得分:0)
您的代码存在的问题是,您将所有3次传递给objectCreator()
同一个对象的功能(当您从0开始时,需要将i <= 2
更改为i < 2
,这样您的存储只有3个相同的对象引用,每次调用函数时都会覆盖这些属性。解决方案是在objectCreator()
内创建新对象,而不是将其作为参数传递。