2017-03-31 137 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

相關問題