3 回答
TA贡献1725条经验 获得超7个赞
一个简单的循环效果很好:
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循环是最快的。
TA贡献1906条经验 获得超3个赞
使用本机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!更快速。
添加回答
举报