查找字符串中指定字符的所有索引

新手上路,请多包涵

例如,如果我在变量中有 "scissors" 并且想知道所有出现的字母 "s" 的位置,它应该打印出 1, 4, 5, 8

我怎样才能以最有效的方式在 JavaScript 中做到这一点?我不认为循环遍历整个过程非常有效

原文由 Ageis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 742
2 个回答

一个简单的循环效果很好:

 var str = "scissors";
var indices = [];
for(var i=0; i<str.length;i++) {
    if (str[i] === "s") indices.push(i);
}

现在,您指出您想要 1、4、5、8。这将为您提供 0、3、4、7,因为索引是从零开始的。所以你可以添加一个:

 if (str[i] === "s") indices.push(i+1);

现在它会给你你预期的结果。

小提琴可以在 这里 看到。

我不认为循环遍历整个过程非常有效

就性能而言,在您开始遇到问题之前,我认为这不是您需要非常担心的事情。

这是一个比较各种答案的 jsPerf 测试。在 Safari 5.1 中,IndexOf 表现最好。在 Chrome 19 中,for 循环是最快的。

在此处输入图像描述

原文由 vcsjones 发布,翻译遵循 CC BY-SA 3.0 许可协议

使用本机 String.prototype.indexOf 方法最有效地找到每个偏移量。

 function locations(substring,string){
  var a=[],i=-1;
  while((i=string.indexOf(substring,i+1)) >= 0) a.push(i);
  return a;
}

console.log(locations("s","scissors"));
//-> [0, 3, 4, 7]

然而,这是一个微优化。对于一个足够快的简单而简洁的循环:

 // Produces the indices in reverse order; throw on a .reverse() if you want
for (var a=[],i=str.length;i--;) if (str[i]=="s") a.push(i);

事实上,原生循环在 chrome 上比使用 indexOf 更快!

来自链接的性能结果图

原文由 Phrogz 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题