2016-09-22 74 views
2

在Node.js的REPL:爲什麼我不能迭代我的ES6 Map的屬性?

> var map = new Map(); 
undefined 
> map['foo'] = 'bar'; 
'bar' 
> map['bar'] = 'baz'; 
'baz' 
> map 
Map { foo: 'bar', bar: 'baz' } 
> map.forEach(console.log); 
undefined 

正如你所看到的,foobar鍵中明確規定map,但是當我嘗試Map.prototype.forEach遍歷他們,什麼都不會發生 - 但according to MDN, it should。還要注意Map.prototype.forEach定義爲,所以不僅僅是這個方法還沒有實現。我也嘗試使用for ... of ...循環,結果相同 - 即使it should,我提供的用於每次迭代的代碼實際上都不會運行。

我在Node.js v4.4.4上。我在網上搜索了「javascript map不是可迭代節點」之類的東西,沒有運氣。

這是怎麼回事?

+0

'Map'對象沒有屬性,它們有條目。使用'新的地圖([['foo','bar'],['bar','baz']])創建它' – Bergi

回答

4

不是100%正面,但我認爲你需要使用map.setMaps

var map = new Map(); 
map.set('foo', 'bar'); 
map.set('bar', 'baz'); 
map.forEach(console.log); 

這會註銷您正在查找的每個項目。因爲Map.prototype.forEach正在尋找可迭代的屬性,所以您需要使用set()函數來設置這些可迭代的屬性。

+0

世界上有什麼?這工作(將允許我儘快接受你的答案),但我不能_imagine_爲什麼這樣 - 或者,爲什麼'map [key]'語法似乎「工作」,但不是真的,以一種令人困惑的方式。不管怎樣,謝謝! – strugee

+2

哦,我明白了。這是因爲我在Map上設置了一個屬性,而'map.set'設置了關鍵字_inside_ Map ......如果這是有道理的。 – strugee

+4

因爲地圖是一個「對象」,所以你可以對任何你想要的屬性打鴨子。就像你可以說'[] .foo =「bar」'一樣,爲了將屬性打到數組上,你可以用Map或者Function來做同樣的事情。因此,當你試圖做到這一點時並沒有錯誤。但是,Maps使用ES6中的'Iterator'功能,這意味着爲了讓您獲得可迭代的東西,您需要使用'.set()'來設置值,而不是使用dotNotation或bracketNotation來設置值。這就是地圖的工作方式。 – frosty

1

Map是一個抽象數據類型。當然,應用Map構造函數與new創建一個普通對象。

const map = new Map([["key1", 1], ["key2", 2]]); 
 

 
// you can mutate the Map object: 
 
map["foo"] = "bar"; 
 
map.bar = "baz"; 
 

 
console.log(map); 
 

 
// but you need to use the Map API to mutate the Map itself: 
 
map.set("key3", 3); 
 

 
map.forEach(console.log.bind(console));

注意,這實際上是新的地圖類型的好處:它分離了data from the program levelMap本身就是它的API(Map.prototype.get/set/has/clear等)背後抽象。

相關問題