用于…的带有索引/键的TypeScript?


145

如此处所述 TypeScript引入了一个foreach循环:

var someArray = [9, 2, 5];
for (var item of someArray) {
    console.log(item); // 9,2,5
}

但是没有索引/键吗?我希望这样的事情:

for (var item, key of someArray) { ... }

Answers:


273

.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()概述的方法。


但是TypeScript将“ for ... of”编译为具有索引var _i的简单“ for”。因此,对于TypeScript开发人员来说,让我们使用此_i很容易。参见操场示例:bit.ly/1R9SfBR
Mick

2
@Mick取决于目标。当转换为ES6时,它不会这样做。在转译时添加额外代码的原因仅是为了使ES6代码能够在过去的版本中工作。
David Sherret

3
你该如何休息?在那每个?
若昂·席尔瓦


您可以使用@JoãoSilva Array.some()并在要停止的迭代中返回false。它不像a那样清晰或漂亮,break但是可以完成工作。我个人不喜欢它,我可能会重新写在一些其他的方式迭代:)看到stackoverflow.com/questions/2641347/...
NEEK


35

抢救“老式JavaScript”(适用于不熟悉/不喜欢函数式编程的人)

for (let i = 0; i < someArray.length ; i++) {
  let item = someArray[i];
}

2
我实际上更喜欢这个答案。不使用额外的方法只是为每个元素生成一个索引。
bluegrounds

谢谢youuu veryyyy muuuchh!我们不知道这一点:)
TSR

14

处理集合时,可以使用TypeScript运算符中的for..in访问索引。

var test = [7,8,9];
for (var i in test) {
   console.log(i + ': ' + test[i]);
} 

输出:

 0: 7
 1: 8
 2: 9

观看演示


请注意,“ i”是不是for..in循环的int字符串。用“ i”执行算术运算将导致字符串连接。第(i + 1)将等于“01”,例如,在i = 0
斯特凡

for..in还可以提供比预期更多的功能,因为它还包括在对象上声明的所有函数。例如:for (var prop in window.document) { console.log(prop); }
Ken Lyon

5

或其他旧式解决方案:

var someArray = [9, 2, 5];
let i = 0;
for (var item of someArray) {
    console.log(item); // 9,2,5
    i++;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.