【问题标题】:Expected a 'for-of' loop instead of a 'for' loop while doing modifications [duplicate]在进行修改时需要一个“for-of”循环而不是一个“for”循环[重复]
【发布时间】:2020-01-14 09:24:01
【问题描述】:

我在使用 TSlint 时遇到问题,并且了解为什么不再允许使用 for(i=0; ...) 循环。

假设我有一个简单的代码,例如:

this.filters['1','2','3'....];
for (let i = 0; i < this.filters.length; i++) {
      if (this.filters[i] === '2') {
        this.filters = new_value;
      }
    }

TSlint 要求我将其转换为 for-of。但是,使用 for-of 不起作用,因为我需要修改值并且 for-of 不允许修改。我可以使用类似

for (const [i, el] of this.filters.entries()) { 

但随后我收到编译警告 TypeScript 和 Iterator:Type 'IterableIterator&lt;T&gt;' 不是数组类型 而且我必须更改编译选项。另外,我可以遍历keys(),我觉得for(const i=0...)有点愚蠢

谁能解释一下为什么 TSlint 仍然在抱怨这个以及为什么不允许使用 for(const i=0; ....)

此外,我刚刚看到如果在 for-of

中执行此代码
this.filters['1','2','3'....];
for (let f of this.filters) {
      if (f === '2') {
        f = new_value;
      }
    }

我最终会得到相同的数组,因为它在循环之后没有被修改,但是,如果我有类似的方法但使用对象

let filters = [{id:'1'},{id:'2'},{id:'3'}];
console.log(filters)
for (let f of filters) {
      if (f.id === '2') {
        f.id = 'toto';
      }
    }
console.log(filters)

惊喜,我的对象数组在循环之后被修改了!谁能解释一下为什么?

谢谢

我搜索了错误,我在 github 中看到它是一个已关闭但我找不到解决方案的问题 https://github.com/palantir/tslint/pull/1813

【问题讨论】:

  • this.filters['1','2','3'....]; 你的意思是this.filters = ['1','2','3'....];
  • 另外,为什么要项目的索引?看来您只关心每个项目的价值,所以for-of 似乎合适。
  • 在迭代器的循环中使用 const 也很奇怪
  • 如果数组中的任何值是2,你想替换整个数组,但在相同的索引处继续迭代?这似乎很奇怪。
  • 在迭代时修改数组是个坏主意,当您修改代码时,可能会出现许多错误。您实际上在做什么似乎没有意义,重新分配要迭代的整个数组?必须修改该代码的任何其他人都会讨厌您以这种方式编写它;)建议,创建一个新数组并修改/添加新项目。

标签: javascript typescript tslint for-of-loop


【解决方案1】:

使用字符串,您会得到以下信息:

字符串分配给f。然后将新值重新分配给f:f === '2'。但是数组中的字符串没有被触及。

有对象:

对对象的引用分配给f。然后正在修改对象:f.id = 'toto'。由于数组只包含对对象的引用 - 我们在数组中得到修改后的对象。

基本上答案是引用类型和值类型变量之间的差异。

如果 for (const [i, el] of this.filters.entries()) { 由于 ts 设置而无法工作,您可以尝试:

arr.forEach((entry, index) => arr[index] = ...);

或者更丑的东西:

for(entry of arr) {
    arr[arr.indexOf(entry)] = ...;
}

【讨论】:

  • 我认为这可能是 OP 所要求的,但他们的问题令人困惑,这个答案也是如此。一个可运行的示例将有助于澄清。您可以在循环中解释,如果您重新分配一个指向原语的变量,您将不会修改数组中的内容。话虽如此,如果这是他们所要求的,这已经被问过一千次了,应该作为重复关闭stackoverflow.com/a/6605700/227299
  • 谢谢 Mendes,但实际上 Alex 提供的帮助比你多。感谢您的 forEach 解决方案。我确实发现它比使用普通 for 更不清晰,但编译器不会抱怨。
猜你喜欢
  • 2018-11-21
  • 2018-08-20
  • 1970-01-01
  • 2019-01-24
  • 2021-08-27
  • 2020-07-10
  • 1970-01-01
  • 2019-07-21
  • 2021-03-28
相关资源
最近更新 更多