gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 00:27:06 24 4
gpt4 key购买 nike

我有以下代码来填充 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 查找的最后一次迭代的时间戳和持续时间值进行填充。

为什么会发生这种情况?是否有一些与 javascript 工作原理相关的内容我不明白?

最佳答案

查看这两行

 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,uration} 对象或 [timestamp,uration] 数组插入其中。

此外,您可以转动这两行

var dArr = [year, month, p+1];
var storeDate = dArr.join("-");

使用模板字符串插入一行

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

关于Javascript 仅将 for 循环中的最后一个条目推送到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54042536/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com