【问题标题】:Javascript Hash Object Not Updating Values ProperlyJavascript 哈希对象未正确更新值
【发布时间】:2017-08-30 03:47:32
【问题描述】:

我无法让我的哈希正确地保持我正在寻找的值。

一些背景来澄清这里的价值观。

我正在用 React 创建一个锻炼应用程序。最后一个功能是创建一个搜索函数来返回用户的最大提升。

该测试适用于卧推。值如下所示。

405 435 285 225 135 185

无论我如何构造哈希,它都会返回 {Bench Press: 185},我希望它对数据进行排序,并且只有在新值大于旧值时才更改值。

const completedExercises = {};

    mergedSets.forEach(set => {
      if (set) {
        let exercise = exercises[set.exercise_id]
        let name = exercise.exercise_name

        if (exercise.ex_type === 'lift') {
          if (completedExercises[name] < (set.weight_lifted)) {
            completedExercises[name] = set.weight_lifted
          } else {
            completedExercises[name] = set.weight_lifted
          }
        }
      }
    })

第一个条件是检查是否设置了用户在他们的日志中没有存储锻炼的情况。

第二个是只做举重类型的运动,因为有氧运动没有举重的价值。

如果条件正常工作并且所有数据都通过,我可以在调试器中看到这两个。

我有一个练习哈希,一组有一个练习 ID,这是我得到名字的地方。该组存储举起的重量。

我对 JS 比较陌生,所以我不确定这是否与使用 forEach 有关,同时我将尝试使用 for 循环。任何帮助,将不胜感激。无论顺序如何,这始终将哈希设置为等于过去的最后一个值。

【问题讨论】:

  • 为什么内部的ifelse 分支做同样的事情?
  • 而结果同样被重构为一个for循环。
  • 我相信你真正需要的是翻转那个符号,正如@nnnnnn 提到你的 if 和 else 语句做同样的事情
  • Javascript (ECMAScript) 没有“哈希对象”,它有对象。您应该提供示例输入和输出,exercises 的价值是什么?
  • @AmrAly facepalm....简单修复,else 条件是设置值,无论我想要什么条件...简单修复,谢谢!

标签: javascript reactjs hash


【解决方案1】:

for 循环或 forEach 无关紧要,这是我在 cmets 中指出的 else 条件!感谢您的帮助,深夜和漫长的一天......

 const completedExercises = {};

    for (var i = 0; i < mergedSets.length; i++) {
      let set = mergedSets[i];
      let exercise = exercises[set.exercise_id]
      let name = exercise.exercise_name

      if (exercise.ex_type === 'lift') {
        if (completedExercises[name] < (set.weight_lifted)) {
          completedExercises[name] = set.weight_lifted
        } else if (!completedExercises[name]) {
          completedExercises[name] = set.weight_lifted
        }
      }
    }

【讨论】:

  • 小心!completedExercises[name]。在 set.weight_lifted 可以为负且 completedExercises[name] 可以为零的情况下,这可以在不应该发生的情况下将零替换为负值。但在这种情况下可能没问题。
  • @RobG 谢谢,我对 JS 比较陌生,有没有更好的条件?
  • 在这种情况下最安全的测试是if (!completedExercises.hasOwnProperty(name)),但如果您使用completedExercises = Object.create(null) 创建没有继承属性的completedExercises,您也可以安全地执行if (!(name in completedExercises))。我希望代码格式没问题。
  • 您可以稍微重构测试并执行if (name in completedExercises) { /* do less than test &amp; assignment */} else { /*assign to comletedExercises[name] */}
猜你喜欢
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
相关资源
最近更新 更多