迭代coffeescript中的字符串而无需创建数组

Dan*_*Dan 7 javascript coffeescript

我的代码中有几个地方需要迭代字符串并通过char执行char操作.我的node.js应用程序需要每次请求执行此操作数十次,并且通常字符串的长度可能相当长.

我看到将下面的一个javascript转换为coffeescript的唯一方法是根据字符串的长度创建一个数组.我有这个问题是在硬件方面做的额外事情,占用额外的内存,而且似乎没必要(我的节点应用程序处理dgrams - 高达每秒数千 - 所以所有这些额外的工作加起来).

JavaScript方式:

for(var i = 0; i < str.length; i++) { /* Do stuff with str here */ }
Run Code Online (Sandbox Code Playgroud)

建议的CoffeeScript方式

for i in [0..str.length]
  # Do stuff here
Run Code Online (Sandbox Code Playgroud)

再一次,我认为当传统的for循环不必从硬件角度搞乱那一步时,强制创建一个数组对象是愚蠢的.

我发现的唯一工作是使用while循环,如:

i = 0
while i < str.length
  # Do stuff
  i++
Run Code Online (Sandbox Code Playgroud)

虽然这有用,但是比使用简单的for循环的直接JavaScript方式更加冗长.

有没有办法在CoffeeScript中使用for循环而不必为了执行基本迭代而生成多余的数组?

vcs*_*nes 13

它实际上并不创建一个数组,如果它没有.看看编译好的JS.这个CoffeeScript:

str = "hello"
for i in [0..(str.length-1)]
  alert(i)
Run Code Online (Sandbox Code Playgroud)

生成以下JavaScript:

var i, str, _i, _ref;

str = "hello";

for (i = _i = 0, _ref = str.length - 1; 0 <= _ref ? _i <= _ref : _i >= _ref; i = 0 <= _ref ? ++_i : --_i) {
  alert(i);
}
Run Code Online (Sandbox Code Playgroud)

实际上没有创建数组.

(减去1到.length以避免未定义)

  • 打败我:D.@Dan以供将来参考,coffeescript网站上的"试用"页面可以很好地用于这些一次性生成示例 (2认同)
  • 具有该语法的@Cerbus coffeescript迭代是双向的,并且编译器此时不知道"0到arg"是向上还是向下计数.通过包含"by 1",您可以将编译器转换为正数,从而生成您可能更习惯的东西.`对于我在[0..str.length]中的1` (2认同)

epi*_*ian 6

您也可以迭代字符串本身:

for ch, i in str
  # Do stuff here.
Run Code Online (Sandbox Code Playgroud)