为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

莫回无 2019-12-03 09:58:49
例如,如果我有"scissors"in变量,并且想知道所有出现的字母的位置"s",它应该打印出来1, 4, 5, 8如何以最有效的方式在JavaScript中执行此操作?我认为遍历整个循环不是非常有效
查看完整描述

3 回答

?
qq_遁去的一_1

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循环是最快的。


查看完整回答
反对 回复 2019-12-03
?
一只名叫tom的猫

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!更快速。


查看完整回答
反对 回复 2019-12-03
  • 3 回答
  • 0 关注
  • 805 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信