2017-07-29 84 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和遍历值,在访问一个对象的键。