我试图迭代一个typescript映射,但我一直得到错误,我找不到任何解决方案,这样一个微不足道的问题。

我的代码是:

myMap : Map<string, boolean>;
for(let key of myMap.keys()) {
   console.log(key);
}

然后我得到Error:

类型'IterableIteratorShim<[string, boolean]>'不是数组类型或字符串类型。

全栈跟踪:

 Error: Typescript found the following errors:
  /home/project/tmp/broccoli_type_script_compiler-input_base_path-q4GtzHgb.tmp/0/src/app/project/project-data.service.ts (21, 20): Type 'IterableIteratorShim<[string, boolean]>' is not an array type or a string type.
    at BroccoliTypeScriptCompiler._doIncrementalBuild (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:115:19)
    at BroccoliTypeScriptCompiler.build (/home/project/node_modules/angular-cli/lib/broccoli/broccoli-typescript.js:43:10)
    at /home/project/node_modules/broccoli-caching-writer/index.js:152:21
    at lib$rsvp$$internal$$tryCatch (/home/project/node_modules/rsvp/dist/rsvp.js:1036:16)
    at lib$rsvp$$internal$$invokeCallback (/home/project/node_modules/rsvp/dist/rsvp.js:1048:17)
    at lib$rsvp$$internal$$publish (/home/project/node_modules/rsvp/dist/rsvp.js:1019:11)
    at lib$rsvp$asap$$flush (/home/project/node_modules/rsvp/dist/rsvp.js:1198:9)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)

我使用angular-cli beta5和typescript 1.8.10,我的目标是es5。 有人遇到过这个问题吗?


当前回答

只是在HTML文档中使用它的一个简单解释。

如果你有一个类型(key, array)的Map,那么你可以这样初始化数组:

public cityShop: Map<string, Shop[]> = new Map();

为了遍历它,你从键值创建一个数组。

只需将其作为数组使用,如下所示:

keys = Array.from(this.cityShop.keys());

然后,在HTML中,你可以使用:

*ngFor="let key of keys"

在这个循环中,你只需要得到数组的值:

this.cityShop.get(key)

完成了!

其他回答

你可以使用map。prototype。forEach((value, key, map) => void, thisArg?):改为void

像这样使用它:

myMap.forEach((value: boolean, key: string) => {
    console.log(key, value);
});

如果你真的不喜欢嵌套函数,你也可以遍历键:

myMap : Map<string, boolean>;
for(let key of myMap) {
   if (myMap.hasOwnProperty(key)) {
       console.log(JSON.stringify({key: key, value: myMap[key]}));
   }
}

注意,您必须使用hasOwnProperty过滤掉非键迭代,如果您不这样做,就会得到警告或错误。

这对我很管用。

Object.keys(myMap).map( key => {
    console.log("key: " + key);
    console.log("value: " + myMap[key]);
});
let map = new Map();

map.set('a', 2);
map.set('b', 4);
map.set('c', 6);
map.set('d', 7);

for(let key of map) 
{ 
    console.log(key[0], "----" key[1]) 
}

输出-

a ---- 2
b ---- 4
c ---- 6
d ---- 7

只需使用Array.from()方法将其转换为Array:

myMap : Map<string, boolean>;
for(let key of Array.from( myMap.keys()) ) {
   console.log(key);
}