有没有一种简单的方法来增加Map对象值的值?

时间:2017-03-31 14:34:00

标签: javascript ecmascript-6

我目前有这个代码,其中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);

显然不起作用。

2 个答案:

答案 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'));