例如,如果我在变量中有 "scissors"
并且想知道所有出现的字母 "s"
的位置,它应该打印出 1, 4, 5, 8
我怎样才能以最有效的方式在 JavaScript 中做到这一点?我不认为循环遍历整个过程非常有效
原文由 Ageis 发布,翻译遵循 CC BY-SA 4.0 许可协议
例如,如果我在变量中有 "scissors"
并且想知道所有出现的字母 "s"
的位置,它应该打印出 1, 4, 5, 8
我怎样才能以最有效的方式在 JavaScript 中做到这一点?我不认为循环遍历整个过程非常有效
原文由 Ageis 发布,翻译遵循 CC BY-SA 4.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 许可协议
13 回答12.9k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
2 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
6 回答1.1k 阅读
2 回答1.3k 阅读✓ 已解决
一个简单的循环效果很好:
现在,您指出您想要 1、4、5、8。这将为您提供 0、3、4、7,因为索引是从零开始的。所以你可以添加一个:
现在它会给你你预期的结果。
小提琴可以在 这里 看到。
就性能而言,在您开始遇到问题之前,我认为这不是您需要非常担心的事情。
这是一个比较各种答案的 jsPerf 测试。在 Safari 5.1 中,IndexOf 表现最好。在 Chrome 19 中,for 循环是最快的。