我目前有这个代码,其中speciesMap是一个映射,其中键将映射作为值。
var speciesMap = new Map();
...
if(!speciesMap.get(species)) {
let obj = new Map();
obj.set('count', 0);
obj.set('vol', 0);
speciesMap.set(species, obj);
}
我想将给定物种的数量增加1,但我发现这样做的唯一方法就是这样。
speciesMap.get(species).set('count', speciesMap.get(species).get('count') + 1);
是否有更简洁的方法来增加价值,而不是再次往返整个地图以检索其价值?同样适用于音量,我需要沿着对象向下添加+ vol
。
想要像
这样的东西speciesMap.get(species).set('count', this+1);
显然不起作用。
答案 0 :(得分:1)
您可以使用辅助功能:
function update(map, key, callback) {
map.set(key, callback(map.get(key)));
}
然后你的长表达成为
update(speciesMap.get(species), 'count', v => v+1);
答案 1 :(得分:0)
@ Bergi的答案很好,但是星期五,所以......
您可以引入一个可变数字类,并使用该类的实例而不是裸数:
class Int {
constructor(n) {
this.n = n;
}
toString() {
return String(this.n);
}
valueOf() {
return this.n;
}
add(m) {
this.n += m;
return this;
}
}
let speciesMap = new Map();
speciesMap.set('elefant', new Map([
['count', new Int(0)],
['vol', new Int(0)]
]));
speciesMap.get('elefant').get('count').add(1);
alert('count is now ' + speciesMap.get('elefant').get('count'));