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)
您的操作方式很好。如果要使用原始值,则需要这样做。如果要避免调用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 语言规范规定,映射操作是基于的prototypes,prototype分配给映射添加数据或从映射检索数据的方法分别是set和get方法。
除了您的不必要的括号之外map.get("a"),您的代码完全没问题。这就是地图的用途。如果您正在寻找“可能”减少代码长度的东西,并且它确实适合您的特定要求,那么您可以使用 JavaScript Object。
亲爱的,您的代码与此相同:
\n\nmap.set("a", map.get("a")+1);\nRun Code Online (Sandbox Code Playgroud)\n
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)