javascript在循环中为json对象添加值

时间:2013-01-04 13:33:50

标签: javascript json

我正在为对象列表中的每个对象添加一个值。但我不知道为什么它为每个循环中的每个对象添加日期。

这是我的代码:

var emptyday: {
    "date":""
}

//make list of days in month
var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = emptyday;
}

所以在我的例子中,我们可以说days_in_months是31(天)

现在加入

for (x=1;x<=days_in_months;x++) {

    console.log(x);
    if (x<10) {
        daynumber = "0" + x;
    } else {
        daynumber = x;
    }

    datestring = year + "-"+ (month+1) + "-" + daynumber;

    dayofmonth = monthlist[x]; 
    dayofmonth["date"] = datestring;
            //monthlist[x].date = datestring;

}

当我尝试添加(dayofmonth [“date”] = datestring或monthlist [x] .date)时,它会添加到每个循环中所有对象的所有日期值。

对于第一个循环,console.log看起来像这样:

[Object {date =“2013-1-01”},Object {date =“2013-1-01”},Object {date =“2013-1-01”},Object {date =“2013- 1-01“},对象{date =”2013-1-01“},对象{date =”2013-1-01“}等

在第一个循环中持续31次

在最后一个循环中它将是2013-1-31

我不明白为什么要将这个值添加到所有对象。我已经尝试过console.log并在所有地方进行调试以读取值并试图了解出了什么问题,但仍然没有找到解决方案

1 个答案:

答案 0 :(得分:3)

数组中的引用都指向同一个对象。 Javascript是按值传递的。所以当你这样做时

//make list of days in month
var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = emptyday;
}

您要在数组中的每个位置放置参考emptyday的副本。由于引用的副本都指向同一个对象文字,因此您有一个对一个对象的引用数组。

每次通过列表时都需要创建一个新的对象文字。

var monthlist = [];
for (i=0;i<=days_in_months;i++) {
    monthlist[i] = {
       date: ""
    };
}