我的地图如下:
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);
但是,这感觉不对。有谁知道一种更清洁的方式?有可能吗?
答案 0 :(得分:5)
您的操作方式很好。如果要使用原始值,则需要这样做。如果要避免调用map.set
,则必须恢复为 reference 的值。换句话说,那么您需要存储一个对象,而不是原始对象:
let map = new Map();
map.set("a", {val: 1});
然后递增变为:
map.get("a").val++;
答案 1 :(得分:0)
答案 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