如何实现基于数组的爱好时长追踪函数,支持缓存累计与无参重置功能
问题根因与解决方案
你的代码核心问题是三个:缺少cache初始值填充、参数名重名导致逻辑混淆、缺少undefined兼容处理,以下是针对你的三个疑问的解答:
- 入参检测实现
hasOwnProperty不适用于该场景,它是对象属性检测方法,和函数入参判断无关。你可以通过arguments.length判断内部函数是否有入参:如果arguments.length === 0就执行重置逻辑,否则执行累加逻辑,也可以直接判断第一个参数是否为undefined。 - cache初始化位置
cache放在外层函数内部的位置是正确的,利用闭包特性可以保证每次调用返回的内部函数时,cache数据不会被重置,符合你的需求。你只是漏了遍历外层传入的爱好数组,给每个爱好设置初始值0的步骤。 - 累加得到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
相关产品推荐
相关产品推荐

