2017-07-29 88 views
2

我正在使用Angular 4創建前端,並且遇到了一個奇怪的錯誤。每當我執行下面的代碼:無法遍歷角4中的地圖

private createProductTree(productData: Map<number, any>): Map<number, Node> { 

    const productTree = new Map<number, Node>(); 

    // Iterate over menu-item objects. 
    for (let key of productData.keys()) { 

     const product = productData.get(key); 
     if (product.type === 'menu-item') { 
     const node = new Node(product); 
     productTree.set(key, node); 
     } 

    } 

    return productTree; 
    } 

我得到以下錯誤:在for (... of ...)Type 'IterableIterator<number>' is not an array type or a string type.

我不知道我在做什麼錯。 for代碼與我看到的代碼here相同。

+0

根據[討論](https://github.com/ Microsoft/TypeScript/issues/6842),它可能與您定位的Javascript版本有關。它應該適用於ES6。 – ConnorsFan

+0

@ConnorsFan,即使在es6中,這也不是迭代Map的正確方法,正如我在答案中提到的。如果使用'keys()',則不需要使用'for..of'。 'forEach'將是更好的選擇 –

回答

5

您不是正確迭代MapMap implements iterable接口並返回一個數組,其中第一個元素是鍵,第二個元素是該值。下面是一個例子from the docs

var myMap = new Map(); 
myMap.set('0', 'foo'); 
myMap.set(1, 'bar'); 
myMap.set({}, 'baz'); 

for (var v of myMap) { 
    console.log(v); 
} 

日誌:

["0", "foo"] 
[1, "bar"] 
[Object, "baz"] 

因此,對於你的例子那就是:

for (let entry of productData) { 
    const product = entry[1]; 
    if (product.type === 'menu-item') { 
    const node = new Node(product); 
    productTree.set(entry[0], entry[1]); 
    } 
} 

然而,這需要在tsconfigtarget=es6

如果你的目標是es5,你可以使用它像這樣:

for (let entry of Array.from(productData.entries())) { 
     ... 
} 

或者使用forEach代替:

Array.from(productData.entries()).forEach((entry)=> { 
    const product = entry[1]; 
    if (product.type === 'menu-item') { 
    const node = new Node(product); 
    productTree.set(entry[0], entry[1]); 
    } 
} 
+0

嗨,我按照你的建議編輯了代碼,但是我仍然有同樣的錯誤:'Type'Map '不是數組類型或字符串類型.'當我嘗試使用(for ...)'循環。我也複製並粘貼了你的例子到我的代碼,我得到這個錯誤:'類型'地圖'不是一個數組類型或字符串類型。「也許這是與Typescript。 – Felipe

+1

你在'tsconfig'中的'target'是什麼?它應該是'es6'來正確地支持'for..of'語法 –

+0

我檢查過並且我的設置是'es5'。當我將它改爲'es6'時,該循環起作用,但我認爲我不應該這樣做,因爲兼容性問題。是否有另外一種方法可以在沒有'for(... of ...)'的情況下通過這個地圖進行循環? – Felipe

0
for (const key in productData) { } 

基本上是forEach和遍歷值,在訪問一個對象的鍵。