代码之家  ›  专栏  ›  技术社区  ›  Cornel Verster

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

  •  0
  • Cornel Verster  · 技术社区  · 6 年前

    我有以下代码来填充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);
    }
    

    因此,从这段代码中,当我在for循环中打印时间戳和持续时间时,我得到了正确的值(例如“Timestamp”:“2019-01-04,“duration”:0)。但是,当我解析并打印viewData对象时,我得到了时间戳值为“2019-01-31”和持续时间为“0”的所有条目“。这些值仅与for循环的最后一次迭代相关。

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Benny Hinrichs    6 年前

    看看这两行

     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}`;
    
        2
  •  0
  •   Robert Dalton    6 年前

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