JavaScript-Map()增量值

Iam*_*mus 6 javascript dictionary loops ecmascript-6

我有如下地图:

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

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

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

map.set("a", (map.get("a"))+1);
Run Code Online (Sandbox Code Playgroud)

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

wuy*_*udi 25

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

map.set("a", (map.get("a") ?? 0) + 1)
Run Code Online (Sandbox Code Playgroud)


tri*_*cot 8

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

let map = new Map();
map.set("a", {val: 1});
Run Code Online (Sandbox Code Playgroud)

然后递增成为:

map.get("a").val++;
Run Code Online (Sandbox Code Playgroud)


小智 7

根据 ECMAScript\xc2\xae 2015 语言规范规定,映射操作是基于的prototypesprototype分配给映射添加数据或从映射检索数据的方法分别是setget方法。

\n\n

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

\n\n

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

\n\n
map.set("a", map.get("a")+1);\n
Run Code Online (Sandbox Code Playgroud)\n


You*_*eem 7

Map 没有增加值的内置功能。然而,由于 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
Run Code Online (Sandbox Code Playgroud)

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

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)
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

现在导入并使用它:

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
Run Code Online (Sandbox Code Playgroud)


小智 -1

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

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

var i = map.get('a')

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

map.set('a', i)
Run Code Online (Sandbox Code Playgroud)