Javascript只将for循环中的最后一个条目推送到对象

Javascript只将for循环中的最后一个条目推送到对象,javascript,arrays,object,Javascript,Arrays,Object,我有以下代码来填充viewData对象: month = 1; year = 2019; days = 31; // data object for return data var viewData = { entries: [] }; // temp data stores var jsonData = {}; var dict = {}; for (var i = 0; i < days; i++) { var dArr = [year, month, i+1]; va

我有以下代码来填充viewData对象:

month = 1;
year = 2019;
days = 31;

// data object for return data
var viewData = {
 entries: []
};

// temp data stores
var jsonData = {};
var dict = {};

for (var i = 0; i < days; i++) {
  var dArr = [year, month, i+1];
  var storeDate = dArr.join("-");
  dict[storeDate] = 0;
}

for (var j in rows) { // I get rows from a SQL call, it works

    var fullString = formatDate(rows[j].EndTime); // this just uses a function to format a date
    var theDate = fullString.split(" "); // this get a date in the format YYYY-MM-dd
    dict[theDate] = dict[theDate] + rows[j].TotalDuration; // add the current duration to relevant dictionary entry
}

for (var p = 0; p < days; p++) {
  // create the date string for dictionary reference 
  var dArr = [year, month, p+1];
  var storeDate = dArr.join("-");

  // populate the jsonData object
  jsonData['timestamp'] = storeDate;
  jsonData['duration'] = dict[storeDate];
  // push the jsonData object to the viewData object
  console.log('---------------------------');
  console.log('Timestamp: ', jsonData['timestamp']);
  console.log('Duration: ', jsonData['duration']);
  viewData.entries.push(jsonData);
}
month=1;
年份=2019年;
天数=31天;
//返回数据的数据对象
var viewData={
条目:[]
};
//临时数据存储
var jsonData={};
var dict={};
对于(变量i=0;i<天;i++){
var dArr=[年,月,i+1];
var storeDate=dArr.join(“-”);
dict[storeDate]=0;
}
对于(varj in rows){//我从SQL调用中获取行,它可以工作
var fullString=formattate(rows[j].EndTime);//这只是使用一个函数来格式化日期
var theDate=fullString.split(“”;//这将获取格式为YYYY MM dd的日期
dict[theDate]=dict[theDate]+行[j].TotalDuration;//将当前持续时间添加到相关词典条目中
}
对于(var p=0;p
因此,从这段代码中,当我在for循环中打印时间戳和持续时间时,我得到了正确的值(例如“Timestamp”:“2019-01-04,“duration”:0)。但是,当我解析并打印viewData对象时,我得到了时间戳值为“2019-01-31”和持续时间为“0”的所有条目“。这些值仅与for循环的最后一次迭代相关

因此,看起来好像viewData对象中的所有条目都只填充了for look最后一次迭代的时间戳和持续时间值


为什么会这样?是否有一些与javascript的工作原理相关的东西我在这里不理解?

viewData.entries.push(jsonData)将对象“jsonData”的引用推送到数组,而不是副本。这意味着,当您更改对象jsonData时,推送到数组的引用也将更改。

查看这两行

 jsonData['timestamp'] = storeDate;
 jsonData['duration'] = dict[storeDate];
jsonData['timestamp']
jsonData['duration']
是特定的键值对,每次迭代时都要在它们上面进行写入。然后当你在最后一行推它时,它只是推一个对对象的引用,而不是实际的对象
console.log
不会像您希望的那样同步发生,因此有时在实际记录时,它只显示更新的对象。你可以这样做:

jsonData[p] = {};
jsonData[p].timestamp = storeDate;
jsonData[p].duration = dict[storeDate];
另一个选项是制作
jsonData
数组,将
{timestamp,duration}
对象或
[timestamp,duration]
数组推入该数组

另外,你可以把这两条线

var dArr = [year, month, p+1];
var storeDate = dArr.join("-");
使用模板字符串转换为单行

var storeDate = `${year}-${month}-{p+1}`;

您能给我们一个
变量的模拟吗?也许,可以使用代码编辑器,这样我们就可以直接从您的代码中获得结果
formatDate
也丢失。您正在将同一对象的
days
次推入
viewData。条目
。您必须推送一个新对象。此外,
var
创建具有函数作用域的变量。因此,在脚本中只有一个
dArr
和一个
storeDate