TypeScript for …与索引/键?
如此处所述, TypeScript引入了一个foreach循环:
var someArray = [9, 2, 5]; for (var item of someArray) { console.log(item); // 9,2,5 }
但是没有索引/键吗? 我会期望像这样的东西:
for (var item, key of someArray) { ... }
.forEach
已经有这个能力:
var someArray = [9, 2, 5]; someArray.forEach((item, index) => { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 });
但是如果你想要…的能力,那么你可以map
数组到项目和索引:
for (const {item, index} of someArray.map((item, index) => ({ item, index }))) { console.log(item); // 9, 2, 5 console.log(index); // 0, 1, 2 }
这有点长,所以它有助于把它放在一个可重用的函数中:
function toItemIndexes<T>(a: T[]) { return a.map((item, index) => ({ item, index })); } for (const {item, index} of toItemIndexes(someArray)) { // ..etc.. }
Iterable版本
如果使用--downlevelIteration
编译器选项进行编译,则这将在定位ES3或ES5时--downlevelIteration
。
function* toItemIndexes<T>(items: T[] | IterableIterator<T>) { let index = 0; for (const item of items) { yield { item, index }; index++; } }
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries
for (var [key, item] of someArray.entries()) { ... }
在TS中,这需要针对ES2015, 因为它要求运行时支持迭代器 ,而ES5运行时却不支持。 你当然可以使用Babel这样的东西来使输出在ES5运行时工作。
在处理集合时,可以使用for..in TypeScript运算符来访问索引。
var test = [7,8,9]; for (var i in test) { console.log(i + ': ' + test[i]); }
输出:
0: 7 1: 8 2: 9
看演示
“老派JavaScript”来拯救(对于那些不熟悉/喜欢function性编程的人来说)
for (var i = 0; i < someArray.length ; i++) { var item = someArray[i]; }