循环每次迭代并将其保存到数组中

时间:2017-03-05 16:47:16

标签: javascript arrays for-loop

我在这里考虑了很多关于主题的主题,但解决方案对我来说似乎并不适用。我想我有一些逻辑问题。我的代码非常简单。我有两个数组(第一个包含三个字符串,第二个包含三个日期)

我想要做的就是将第一个字符串存储在第一个数组中,第一个日期存储在对象的第二个数组中。

我在函数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())

3 个答案:

答案 0 :(得分:1)

你走了(:

注意:您不必在每次迭代时都创建新对象,您可以使用Array#forEach并将具有已设置属性和键的对象推送到{{ 1}}数组。

&#13;
&#13;
result
&#13;
&#13;
&#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()内创建新对象,而不是将其作为参数传递。