【问题标题】:Creating an object from arrays从数组创建对象
【发布时间】:2021-12-06 18:13:59
【问题描述】:

我正在尝试创建一个函数来跟踪在爱好上花费了多少小时。输入是一组爱好。我正在尝试创建一个缓存对象,其中每个爱好作为键,花费的时间作为值。我正在尝试使用一个返回函数,它接受一个表示爱好的字符串和一个表示练习多少小时的整数作为参数。

我正在尝试通过将传递的整数的值添加到与传入的“爱好”对应的键处的缓存中来更新缓存对象中的返回函数。如果没有传入返回函数的参数,我希望返回函数将缓存对象中的所有值重置为零。

这是我迄今为止尝试过的......

function hobbyTracker(hobbies) {
  const cache = {};
  return function(hobbies, hours) {
    if (hobbies) {
      cache[hobbies] += hours;
      return cache;
    } else {
      for (let key in cache) {
        cache[key] = 0;
      }
      return 'tracker has been reset!';
    }
  }
  return cache;
}

我不确定如何编写“if”语句来检查是否已传入参数。我认为 .hasOwnProptery() 在这里不起作用,对吗?我的思路是因为它适用于我理解的键,而且对象尚未填充!

我也不确定应该在哪里初始化缓存对象!这是我的代码问题的一部分吗?

我也知道我的返回函数没有正确更新时间。我需要它来累积花费的总小时数,但相反,我的代码只是在新输入时覆盖它。我尝试在 cache[hobbies] = hours 上使用 +=,但后来我得到了一个由 NaN 填充的对象。

任何帮助将不胜感激!

【问题讨论】:

  • 你有一些想要结果的例子吗?
  • 你不能从同一个函数返回两次。 hobbyTracker()应该返回函数还是缓存?

标签: javascript arrays object key


【解决方案1】:

您可以使用特殊对象arguments。它是一个包含所有参数的类数组对象。如果未传递任何参数,则其长度为0

if (arguments.length = 2) {
    // use hobbies and hours
} else {
    // reset cache
}

【讨论】:

    【解决方案2】:

    你的 if 语句很好。如果提供了hobby,请执行某些操作,否则清除cache。您错过了为缓存中缺少的爱好添加检查(第一次),因此您不必添加,但在 cache 中创建密钥并分配 hours

    最终的代码可能如下所示:

    function hobbyTracker() {
      const cache = {};
      return function(hobby, hours) {
        if (hobby) {
          if (cache[hobby]) {
            cache[hobby] += hours;
          } else {
            cache[hobby] = hours;
          }
        } else {
          Object.keys(cache).forEach((key) => { cache[key] = 0 })
        }
        return cache;
      }
    }
    
    
    const myHobbyTracker = hobbyTracker();
    
    console.log(myHobbyTracker('ski', 8))
    console.log(myHobbyTracker('basket', 5))
    console.log(myHobbyTracker('ski', 3))
    console.log(myHobbyTracker())
    • 此代码始终返回cache
    • 我还更改了清除 cache 的方式,尽管您的 for 循环工作正常(我只是不是忠实粉丝)。
    • hobbies 参数重命名为 hobby,因为您一次只提供一个。

    我也不确定应该在哪里初始化缓存对象!

    使用hobbyTracker函数作用域初始化缓存对象似乎是合理的,因此您可以将其设为私有且可从返回的函数中访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多