打字稿循环遍历具有索引和值的字符串

Posted

技术标签:

【中文标题】打字稿循环遍历具有索引和值的字符串【英文标题】:Typescript loop through string with index and value 【发布时间】:2020-03-08 00:39:21 【问题描述】:

我想遍历一个字符串,并且我想同时拥有该索引处的索引和字符。我知道我可以为此使用一个简单的 for 循环,但我认为 javascript/Typescript 的一些新功能可能更优雅,所以我尝试了这个:

for (const [i, character] of Object.entries('Hello ***')) 
    console.log(i);
    console.log(typeof(i));
    console.log(character);

这很有效,但是即使i 计数,它也是一个字符串。所以例如这个 不起作用:

'other string'.charAt(i)

我是 Typescript 的新手,所以我的问题是:

为什么 i 是字符串而不是数字? 有没有更简单/更优雅的方法来做到这一点?

【问题讨论】:

i 是一个数字。 i 输出 '1' '2' 以此类推,typeof(i) 输出 'string' 是的,我的错,没有意识到这一点。 【参考方案1】:

Unicode 安全的方法是使用扩展语法拆分为字符:

const chars = [...text];

然后你使用旧的 Array.prototype.forEach 进行迭代

chars.forEach((c, i) => console.log(c, i));

【讨论】:

看起来很优雅,但是我收到const chars = [...text]; 的此错误:Type 'string' is not an array type or a string type. Use compiler option '--downlevelIteration' to allow iterating of iterators.ts(2569) "Type 'string' 不是数组类型或字符串类型" --- 这看起来很尴尬:你的 text 到底是什么? @Vladtn 将目标从 es5 更改为 es2015 或 es6 可解决此问题,请参阅 ***.com/a/59662571/331719【参考方案2】:

为什么 i 是字符串而不是数字?

因为Object.entries() 返回一个键值对并且旨在用于对象,其中键当然是字符串。

有没有更简单/更优雅的方法来做到这一点?

只需一个带有 charAt(i) 的简单 for 循环就可以解决问题:

const text = 'Hello ***';
for (let i = 0; i < text.length; i++) 
  const character = text.charAt(i);
  console.log(i, character);

【讨论】:

text.charAt 可能会破坏 Unicode 字符。试试const text = '?‍?‍?‍?'; @bauke 无论如何,我会用普通的 Javascript 做些什么,谢谢! :) @Fels 虽然它坏了

以上是关于打字稿循环遍历具有索引和值的字符串的主要内容,如果未能解决你的问题,请参考以下文章

具有默认值的打字稿固定数组

打字稿 |从对象 T 中提取具有类型 K 值的所有键名

如何在打字稿中使用可能的字符串和数字索引确定对象的类型?

打字稿中迭代的索引签名

打字稿:如何根据对象键/值类型在 ES6 映射中创建条目

避免任何类型在打字稿中获取枚举值