结合hasOwnProperty遍历对象与数组匹配日期,修正代码实现目标输出
日期匹配值映射的代码修正
原始数据与需求
- 目标对象(注意:键必须用引号包裹,否则会被JS解析为减法运算):
const obj = {"23-10-2022": 3, "24-10-2022": 1, "28-10-2022": 4, "29-10-2022": 1, "30-10-2022": 1} - 日期数组:
const dates = ["19-10-2022", "20-10-2022", "21-10-2022", "22-10-2022", "23-10-2022", "24-10-2022", "25-10-2022", "26-10-2022", "27-10-2022", "28-10-2022", "29-10-2022", "30-10-2022", "31-10-2022"] - 核心需求:遍历日期数组,每个日期若匹配对象的键则取对应值,不匹配则取0;匹配后切换到下一个对象键,从当前数组位置继续遍历。期望输出:
0,0,0,0,3,1,0,0,0,4,1,1,0
原代码的问题
- 嵌套循环逻辑错误:外层遍历对象键时,内层每次从头遍历整个
dates数组,导致每个对象键都会重复匹配所有日期,输出重复的0和值。 - 提前终止函数:代码中的
return key、return value会直接终止函数,无法完成完整的遍历和结果收集。 - 无效的键修改:
key++对字符串类型的对象键完全无效,会得到NaN,且对象键无法通过自增切换。 - 对象键语法错误:原对象的键未加引号,
23-10-2022会被解析为23-10-2022 = -2010,变成数字键,无法和日期字符串匹配。
修正方案
方案一:直接映射(简洁高效)
需求本质是给dates数组的每个元素做值映射,直接遍历数组并查询对象即可:
const obj = {"23-10-2022": 3, "24-10-2022": 1, "28-10-2022": 4, "29-10-2022": 1, "30-10-2022": 1}; const dates = ["19-10-2022", "20-10-2022", "21-10-2022", "22-10-2022", "23-10-2022", "24-10-2022", "25-10-2022", "26-10-2022", "27-10-2022", "28-10-2022", "29-10-2022", "30-10-2022", "31-10-2022"]; const result = dates.map(date => obj[date] || 0); console.log(result.join(',')); // 输出:0,0,0,0,3,1,0,0,0,4,1,1,0
方案二:双指针实现严格匹配逻辑
如果需要严格遵循“匹配后切换对象键并继续遍历”的逻辑,使用双指针控制遍历进度:
const obj = {"23-10-2022": 3, "24-10-2022": 1, "28-10-2022": 4, "29-10-2022": 1, "30-10-2022": 1}; const dates = ["19-10-2022", "20-10-2022", "21-10-2022", "22-10-2022", "23-10-2022", "24-10-2022", "25-10-2022", "26-10-2022", "27-10-2022", "28-10-2022", "29-10-2022", "30-10-2022", "31-10-2022"]; const objKeys = Object.keys(obj); const result = []; let keyIndex = 0; for (let i = 0; i < dates.length; i++) { const currentDate = dates[i]; const currentKey = objKeys[keyIndex]; if (currentDate === currentKey) { result.push(obj[currentKey]); keyIndex++; // 对象键遍历完后,剩余日期直接填充0 if (keyIndex >= objKeys.length) { result.push(...dates.slice(i + 1).map(() => 0)); break; } } else { result.push(0); } } console.log(result.join(',')); // 输出:0,0,0,0,3,1,0,0,0,4,1,1,0
内容的提问来源于stack exchange,提问作者gedamo
相关产品推荐
相关产品推荐

