我正在做家庭作业。这是我的问题和尝试的解决方案。
在字符串“tx_val”中显示字符“e”的每个出现位置
tx_val="the quick brown fox jumped over the lazy dogs back";
os=' '; //output string
eloc=' ';
for (i=0; i<tx_val.lastIndexOf('e');i++)
{
if(tx_val.indexOf('e')!= -1)
{
eloc=tx_val.indexOf('e') ;
os=os+eloc;
i++;
}
}
我的预期结果:2 24 29 34
我的结果:2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
我不是在寻找答案,而是为了解释为什么我的逻辑不起作用并指出我正确的方向。
答案 0 :(得分:4)
当在同一个字符串上使用单个参数调用时,indexOf()
将每次都返回相同的索引。
indexOf()
的第一个参数是要匹配的子字符串。第二个可选参数是启动搜索表单的索引。除非您传递此参数,否则结果不会在每次迭代之间发生变化。
假设循环应该具有等于i
值的lastIndexOf()
迭代器,这也是不正确的。这只会使循环运行许多冗余迭代,因为匹配数肯定不等于匹配索引的值(除非字符串仅由e
个字符组成)。换句话说,如果索引24
中只有一个匹配,那么循环仍会无缘无故地重复23次。
答案 1 :(得分:2)
更好的解决方案可能是这样的:
var lastIndex = tx_val.indexOf('e');
while (lastIndex > -1) {
os += lastIndex + " ";
lastIndex = tx_val.indexOf('e',lastIndex + 1);
}
答案 2 :(得分:1)
其他人已经提供了解决方案(indexOf
的第二个参数)。
我会在这里留下这一行
tx_val.replace(/e/g, function(str, i) {os = os + ' ' + i});
答案 3 :(得分:0)
如果您尝试将字符串拆分为单个字符数组,解析它并将匹配的索引存储在另一个(输出)数组中会怎样?