迭代Typescript Map

我试图迭代一个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。 有人遇到过这个问题吗?< / p >
425249 次浏览

你可以使用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过滤掉非键迭代,如果你不这样做,你会得到一个警告或错误。

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

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

es6

for (let [key, value] of map) {
console.log(key, value);
}

es5

for (let entry of Array.from(map.entries())) {
let key = entry[0];
let value = entry[1];
}

我使用最新的TS和节点(v2.6和v8.9分别),我可以做:

let myMap = new Map<string, boolean>();
myMap.set("a", true);
for (let [k, v] of myMap) {
console.log(k + "=" + v);
}

根据TypeScript 2.3关于“New --downlevelIteration”的发布说明:

for..of statements,数组解构,数组元素在数组,调用和新表达式支持Symbol。在ES5/E3中使用--downlevelIteration时可用的迭代器

默认情况下不启用!"downlevelIteration": true添加到你的tsconfig.json中,或将--downlevelIteration标志传递给tsc,以获得完整的迭代器支持。

有了这些,你可以写for (let keyval of myMap) {...}keyval的类型就会自动被推断出来。


为什么默认关闭?根据TypeScript贡献者@aluanhaddad

它是可选的,因为它对生成的代码的大小有非常重要的影响,并且对于所有使用可迭代对象(包括数组)的性能也有潜在的影响。

如果你的目标是ES2015 ("target": "es2015"tsconfig.jsontsc --target ES2015中)或更高版本,启用downlevelIteration是显而易见的,但如果你的目标是ES5/ES3,你可能会基准测试以确保迭代器支持不会影响性能(如果会影响性能,你可能会更好地使用Array.from转换或forEach或其他变通方法)。

使用Array.fromArray.prototype.forEach ()箭头功能:

遍历:

Array.from(myMap.keys()).forEach(key => console.log(key));

遍历:

Array.from(myMap.values()).forEach(value => console.log(value));

遍历条目:

Array.from(myMap.entries()).forEach(entry => console.log('Key: ' + entry[0] + ' Value: ' + entry[1]));

这对我很管用。TypeScript版本:2.8.3

for (const [key, value] of Object.entries(myMap)) {
console.log(key, value);
}

只是在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)

完成了!

这对我很管用。

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

你也可以将数组map方法应用到map .entries()迭代对象上:

[...myMap.entries()].map(
([key, value]: [string, number]) => console.log(key, value)
);

另外,正如在其他回答中提到的,您可能必须在tsconfig中启用低级迭代。Json(在编译器选项下):

  "downlevelIteration": true,

在Typescript 3.5和Angular 8 LTS中,需要按如下方式强制转换类型:

for (let [k, v] of Object.entries(someMap)) {
console.log(k, v)
}

我尝试使用Array.from( myMap.keys() )在我的VSCode扩展中获得一个键数组,该扩展使用node.js实现,但它不起作用,即使在将"downlevelIteration": true添加到我的tsconfig之后。根据艾哈迈德记者Fasih和其他方法的建议,将目标设置为es2017

最终起作用的是杰森Slobotski的建议使用Object.keys:

let keys = Object.keys(myMap);
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