【问题标题】:JavaScript - Map() increment valueJavaScript - Map() 增量值
【发布时间】:2019-05-04 04:38:10
【问题描述】:

我有一张地图如下:

let map = new Map();
map.set("a", 1);
//Map is now {'a' => 1}

我想将a 的值更改为2,或者将其递增:map.get("a")++;

目前,我正在使用以下内容:

map.set("a", (map.get("a"))+1);

但是,这感觉不对。有谁知道这样做的更清洁的方法?有可能吗?

【问题讨论】:

  • 除了多余的括号外,这就是它的完成方式。
  • 看起来不错。 PS:感觉你在用iterate这个词来表达别的东西。
  • 这没关系,因为 JavaScript 使用单线程运行循环,因此在 .get.set 之间的另一个事件处理程序中没有机会读取 a(如果此代码在使用共享地图的事件处理程序)。

标签: javascript loops dictionary ecmascript-6


【解决方案1】:

我不知道有什么更简洁的方法可以做到这一点,但我认为一切都取决于你的代码上下文。

如果你正在迭代一个数组或其他东西并且你想增加你的变量,我建议使用一个局部变量来做到这一点,并在迭代结束时,在映射中设置值。

var i = map.get('a')

values.forEach( el => {
  i += el.someField
})

map.set('a', i)

【讨论】:

    【解决方案2】:

    Map#get 返回指定元素的值。它与对象访问器 (object['a']) 相对,不适合左侧赋值。

    结论是始终使用Map#set 来设置新值。

    【讨论】:

      【解决方案3】:

      根据 ECMAScript® 2015 语言规范规定,地图操作基于 prototypes,分配给地图添加数据或从地图检索数据的 prototype 方法分别是 setget 方法。

      除了map.get("a") 周围不必要的括号外,您的代码完全没问题。这就是地图的用途。如果您正在寻找“可能”减少代码长度的东西,并且如果它确实满足您的特定要求,您可以使用 JavaScript Object

      亲爱的,你的代码就是这样的:

      map.set("a", map.get("a")+1);
      

      【讨论】:

        【解决方案4】:

        你这样做的方式很好。如果您使用原始值,这就是您需要这样做的方式。如果您想避免对map.set 的调用,那么您必须恢复到对值的引用。换句话说,那么你需要存储一个对象,而不是一个原语:

        let map = new Map();
        map.set("a", {val: 1});
        

        然后递增变为:

        map.get("a").val++;
        

        【讨论】:

          【解决方案5】:

          地图没有增加值的内置功能。但是,由于可以修改 JavaScript 结构,您实际上可以自己进行修改:

          let map = new Map()
          // Modify your map
          map.constructor.prototype.increment = function (key) {
            this.has(key) && this.set(key, this.get(key) + 1)
          }
          map.constructor.prototype.decrement = function (key) {
            this.has(key) && this.set(key, this.get(key) - 1)
          }
          
          // Now you can use it right away
          map.set('test', 1)
          map.increment('test')
          map.increment('test')
          map.decrement('test')
          console.log(map.get('test')) // returns 2
          

          为了在将来更容易,您可以将其抽象为实用程序:

          class CyborgMap extends Map {
            constructor() {
              super()
              
              this.constructor.prototype.increment = function (key) {
                this.has(key) && this.set(key, this.get(key) + 1)
              }
              this.constructor.prototype.decrement = function (key) {
                this.has(key) && this.set(key, this.get(key) - 1)
              }
            }
          }
          

          现在导入并使用它:

          import { CyborgMap } from "./utils"
          
          let map = new CyborgMap()
          map.set('test', 1)
          map.increment('test')
          map.increment('test')
          map.decrement('test')
          console.log(map.get('test')) // returns 2
          

          【讨论】:

            【解决方案6】:

            map 中,如果您没有找到任何元素,它将给出undefined。所以,我们可以用下面的代码来做增量:

            map.set("a", map.get("a") == undefined ? 1 : map.get("a") + 1);
            

            或者只是

            map.set('a', map.get('a') + 1 || 1);
            

            【讨论】:

              【解决方案7】:

              对于现代 js,你可以这样做:

              map.set("a", (map.get("a") ?? 0) + 1)
              

              【讨论】:

                猜你喜欢
                • 2014-05-09
                • 1970-01-01
                • 1970-01-01
                • 2019-07-28
                • 1970-01-01
                • 2021-04-04
                • 2011-08-26
                • 2014-10-13
                • 2013-11-23
                相关资源
                最近更新 更多