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

如何实现基于数组的爱好时长追踪函数,支持缓存累计与无参重置功能

问题根因与解决方案

你的代码核心问题是三个:缺少cache初始值填充、参数名重名导致逻辑混淆、缺少undefined兼容处理,以下是针对你的三个疑问的解答:

  1. 入参检测实现
    hasOwnProperty不适用于该场景,它是对象属性检测方法,和函数入参判断无关。你可以通过arguments.length判断内部函数是否有入参:如果arguments.length === 0就执行重置逻辑,否则执行累加逻辑,也可以直接判断第一个参数是否为undefined。
  2. cache初始化位置
    cache放在外层函数内部的位置是正确的,利用闭包特性可以保证每次调用返回的内部函数时,cache数据不会被重置,符合你的需求。你只是漏了遍历外层传入的爱好数组,给每个爱好设置初始值0的步骤。
  3. 累加得到NaN的原因
    因为你没有给cache的键设置初始值,第一次访问cache[hobbies]时得到的是undefined,undefined + 数字的结果就是NaN。只需要在初始化cache时遍历传入的爱好数组,给每个键赋值为0即可解决。

修正后完整代码

function hobbyTracker(hobbies) {
  // 初始化cache,给每个爱好设置初始时长0
  const cache = {};
  hobbies.forEach(hobby => {
    cache[hobby] = 0;
  });
  // 内部函数参数名改为hobby,避免和外层的爱好数组重名
  return function(hobby, hours) {
    // 判断是否无入参,执行重置逻辑
    if (arguments.length === 0) {
      for (let key in cache) {
        cache[key] = 0;
      }
      return 'tracker has been reset!';
    }
    // 累加逻辑,额外加了判断:只处理初始化时存在的爱好,避免非法属性写入
    if (cache.hasOwnProperty(hobby) && typeof hours === 'number') {
      cache[hobby] += hours;
    }
    return cache;
  }
}

使用示例

const tracker = hobbyTracker(['跑步', '阅读', '弹琴']);
console.log(tracker('跑步', 30)); // {跑步: 30, 阅读:0, 弹琴:0}
console.log(tracker('跑步', 20)); // {跑步:50, 阅读:0, 弹琴:0}
console.log(tracker()); // 'tracker has been reset!'
console.log(tracker('跑步', 10)); // {跑步:10, 阅读:0, 弹琴:0}

内容的提问来源于stack exchange,提问作者DaShaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:18:00