Javascript 无法在Angular 4中遍历贴图

Javascript 无法在Angular 4中遍历贴图,javascript,angular,typescript,Javascript,Angular,Typescript,我用Angular 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

我用Angular 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;
  }
私有createProductTree(productData:Map):Map{
const productTree=新映射();
//迭代菜单项对象。
for(让productData.keys()的键){
const product=productData.get(键);
如果(product.type==='菜单项'){
const node=新节点(产品);
productTree.set(键,节点);
}
}
返回产品树;
}
我得到以下错误:
类型“IterableIterator”不是数组类型或字符串类型。
for(…of…)
行中

我不确定我做错了什么。的
代码与我看到的代码相同


of基本上是forEach,在访问对象的键时对值进行迭代。

您没有正确地迭代
Map
Map
实现
iterable
接口并返回一个数组,其中第一个元素是键,第二个元素是值。以下是一个例子:

日志:

因此,对于您的示例,它将是:

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]);
  }
}
但是,这需要
tsconfig
中的
target=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]);
  }
}

您好,我按照您的建议编辑了代码,但仍然有相同的错误:
类型“Map”不是数组类型或字符串类型。
当我尝试使用
for(…of…)
循环时。我还将您的示例复制并粘贴到我的代码中,我得到了以下错误:
类型“Map”不是数组类型或字符串类型。
可能是与Typescript有关的内容。
tsconfig
中的
目标是什么?它应该是
es6
来支持
for..of
语法正确我检查了,我的设置是
es5
。当我将循环更改为
es6
时,循环工作正常,但是我认为我不应该这样做,因为兼容性问题。是否有其他方法可以在没有(…of…)
的情况下循环此映射?类型“map”不是数组类型或字符串类型-是的,这是typescript的问题。它认为只有
数组
字符串
才是最合适的。。。我已将代码更改为您建议的代码,但我仍然收到错误提示,
条目
不是函数:
失败:productData.entries不是函数
。也许我必须将
Map
类导入到我的文件中,但我找不到正确的导入。根据,它可能与您目标的Javascript版本有关。它应该适用于ES6。@ConnorsFan,即使在ES6中,这也不是我在回答中提到的迭代映射的正确方法。如果一个人使用
keys()
的话,就没有必要使用
for..of
forEach
将是一个更好的选择
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]);
  }
}
for (let entry of Array.from(productData.entries())) {
       ...
}
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]);
  }
}