You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

结合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

原代码的问题

  1. 嵌套循环逻辑错误:外层遍历对象键时,内层每次从头遍历整个dates数组,导致每个对象键都会重复匹配所有日期,输出重复的0和值。
  2. 提前终止函数:代码中的return key、return value会直接终止函数,无法完成完整的遍历和结果收集。
  3. 无效的键修改:key++对字符串类型的对象键完全无效,会得到NaN,且对象键无法通过自增切换。
  4. 对象键语法错误:原对象的键未加引号,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 23:10:52