Answers:
.forEach
已经具备此功能:
const someArray = [9, 2, 5];
someArray.forEach((value, index) => {
console.log(index); // 0, 1, 2
console.log(value); // 9, 2, 5
});
但是,如果您需要的能力for...of
,则可以map
将数组添加到索引和值:
for (const { index, value } of someArray.map((value, index) => ({ index, value }))) {
console.log(index); // 0, 1, 2
console.log(value); // 9, 2, 5
}
这有点长,所以将其放入可重用的函数中可能会有所帮助:
function toEntries<T>(a: T[]) {
return a.map((value, index) => [index, value] as const);
}
for (const [index, value] of toEntries(someArray)) {
// ..etc..
}
迭代版本
针对ES3或ES5的时候,如果你用编译这将工作--downlevelIteration
编译器选项。
function* toEntries<T>(values: T[] | IterableIterator<T>) {
let index = 0;
for (const value of values) {
yield [index, value] as const;
index++;
}
}
Array.prototype.entries()-ES6 +
如果您能够定位到ES6 +环境,则可以使用Arnavion的答案中.entries()
概述的方法。
Array.some()
并在要停止的迭代中返回false。它不像a那样清晰或漂亮,break
但是可以完成工作。我个人不喜欢它,我可能会重新写在一些其他的方式迭代:)看到stackoverflow.com/questions/2641347/...
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/entries
for (var [key, item] of someArray.entries()) { ... }
在TS中,这要求以ES2015为目标,因为它要求运行时支持迭代器,而ES5运行时则不需要。当然,您可以使用Babel之类的东西使输出在ES5运行时上运行。
抢救“老式JavaScript”(适用于不熟悉/不喜欢函数式编程的人)
for (let i = 0; i < someArray.length ; i++) {
let item = someArray[i];
}
处理集合时,可以使用TypeScript运算符中的for..in访问索引。
var test = [7,8,9];
for (var i in test) {
console.log(i + ': ' + test[i]);
}
输出:
0: 7
1: 8
2: 9
观看演示
for..in
还可以提供比预期更多的功能,因为它还包括在对象上声明的所有函数。例如:for (var prop in window.document) { console.log(prop); }