【问题标题】:TypeScript for ... of with index / key?TypeScript for ... of with index / key?
【发布时间】:2016-07-06 14:36:09
【问题描述】:

正如here 所述,TypeScript 引入了一个 foreach 循环:

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

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

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

【问题讨论】:

    标签: for-loop foreach typescript


    【解决方案1】:

    .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..
    }
    

    可迭代版本

    如果您使用 --downlevelIteration 编译器选项进行编译,这将在针对 ES3 或 ES5 时起作用。

    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's answer 中所述的.entries() 方法。

    【讨论】:

    • 但是 TypeScript 将“for ... of”编译为一个简单的“for”,它有一个索引 var _i。所以 TypeScript 开发者很容易让我们使用这个 _i。请参阅操场示例:bit.ly/1R9SfBR
    • @Mick 它取决于目标。转译到 ES6 时,它不会那样做。转译时额外代码的原因只是为了让 ES6 代码在过去的版本中工作。
    • 怎么休息;在那个 forEach 中?
    • 也是一个很好的答案stackoverflow.com/questions/34348937/…
    • @JoãoSilva 你可以使用Array.some() 并在你想停止的迭代中返回false。它不像break 那样清晰或漂亮,但它可以完成工作。我个人不喜欢它,我可能会以其他方式重新编写迭代:) 见stackoverflow.com/questions/2641347/…
    【解决方案2】:

    或者其他老派的解决方案:

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

    【讨论】:

      【解决方案3】:

      “老派 javascript”来拯救(对于那些不熟悉/不喜欢函数式编程的人)

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

      【讨论】:

      • 我实际上最喜欢这个答案。不使用额外的方法来为每个元素生成索引。
      • 谢谢youuuveryyyy muuuchh!我们不知道这个:)
      【解决方案4】:

      您可以在处理集合时使用 for..in TypeScript 运算符来访问索引。

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

      输出:

       0: 7
       1: 8
       2: 9
      

      Demo

      【讨论】:

      • 请注意,“i”是一个字符串,而不是带有 for..in 循环的 int。使用“i”执行算术运算将导致字符串连接。 (i + 1) 将等于“01”,例如当 i = 0
      • for..in 还可以为您提供超出您预期的功能,因为它还包括在对象上声明的所有函数。例如:for (var prop in window.document) { console.log(prop); }
      【解决方案5】:

      https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/entries

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

      在 TS 中,这需要针对 ES2015 since it requires the runtime to support iterators,而 ES5 运行时不需要。你当然可以使用 Babel 之类的东西来使输出在 ES5 运行时上工作。

      【讨论】:

      猜你喜欢
      • 2017-04-09
      • 2021-03-25
      • 2021-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-05-20
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多