2017-03-31 97 views
0

我目前有这样的代码,其中speciesMap是一个映射,其中键具有映射值。有没有简单的方法来增加Map对象的值?

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

我想'obj'应该是一个对象,而不是一个'Map',当你不使用动态密钥的任何地方? – Bergi

+0

因为我之前没有在javascript中使用过动态按键,所以我被这个功能搞乱了,并且被带走了,但是'obj'可以是一个对象。会从代码中移除一个'get()'。 – hitsugan

+0

是的,你可以做'specialMap.get(species).count ++;':-) – Bergi

回答

1

您可以使用一个辅助功能:

function update(map, key, callback) { 
    map.set(key, callback(map.get(key))); 
} 

则长表达变得

update(speciesMap.get(species), 'count', v => v+1); 
+0

我还在使用ES6胖箭头功能,但这很有意义,它很简洁。谢谢。 – hitsugan

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

+0

Bergi的anwser比较简单,因为我真的只需要操作数字(+1和+ var),但这是一个有用的提示类。 '返回这个',这总是很棒的+1。谢谢。 – hitsugan

+0

可变数字?不寒而栗。让我们制作一张不可变的地图...:D – Bergi

相关问题