遍历日期数组给depDate赋值后仅输出最后一个值的问题排查
问题:遍历日期数组时仅输出最后一个日期
你生成日期数组的逻辑没问题,但writeBody函数里的循环写法导致了只输出最后一个日期,问题出在这两点:
- 循环代码块范围错误:你的
for循环没有用花括号{}包裹执行代码,默认只有紧随其后的那一行(depDate = dates[i].slice(0, 10);)属于循环体,而console.log([depDate]);在循环外面,只会在整个循环结束后执行一次,此时depDate已经被最后一次循环覆盖为数组的最后一个元素。 - 全局变量重复覆盖:
depDate是全局变量,每次循环都会用当前元素的值覆盖它,即使日志在循环里,也没必要用全局变量,改用局部变量更合理。
修正后的代码(方法一:修复for循环结构)
//run this to generate the dates let dates = []; function createDates() { const listLength = 10; // days for (let i = 0; i < listLength; i++) { let itemDate = new Date(); // starting today itemDate.setDate(itemDate.getDate() + i); dates.push(itemDate.toISOString()); } return dates; } createDates(); const writeBody = () => { for (let i = 0; i < dates.length; i++) { // 用局部变量存储当前日期,避免全局覆盖 const depDate = dates[i].slice(0, 10); console.log(depDate); } } writeBody();
更简洁的写法(方法二:使用forEach遍历)
如果不需要索引,用数组的forEach方法更直观:
const writeBody = () => { dates.forEach(date => { const depDate = date.slice(0, 10); console.log(depDate); }); }
这样修改后,每次循环都会输出当前迭代的日期,符合你的预期。
内容的提问来源于stack exchange,提问作者Jbleasdale
相关产品推荐
相关产品推荐

