JavaScript-Map()增量值

时间:2018-12-02 20:36:26

标签: javascript loops dictionary ecmascript-6

我的地图如下:

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);

但是,这感觉不对。有谁知道一种更清洁的方式?有可能吗?

6 个答案:

答案 0 :(得分:5)

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

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

然后递增变为:

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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

亲爱的,您的代码与此相同:

Object

答案 3 :(得分:0)

map 中,如果您没有找到任何元素,它将给出 undefined。因此,我们可以使用以下代码进行增量:

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

答案 4 :(得分:-1)

我不知道有什么更干净的方法,但是我认为一切都取决于代码的上下文。

如果要迭代数组或其他内容,并且想增加变量,我建议使用局部变量来完成此操作,并在迭代结束时在映射中设置值。

var i = map.get('a')

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

map.set('a', i)

答案 5 :(得分:-1)

地图不具有增加值的内置功能。但是,由于可以修改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