3

我试图找出循环字符串并查找某个字母的所有索引的最有效方法。

我曾经$word_or_phrase.indexOf( $letter );找到一个字母的单个索引,但该字母$word_or_phrase多次出现。最有效的方法是构建所有索引的数组,直到.indexOf返回-1?或者你会如何建议我找到所有的索引?

我已经花时间发现了这个: Javascript str.search() multiple instances

这可行,但对我来说,在处理超过 2 个索引时似乎效率不高。如果我有 10 个呢?

提前感谢您的建议!

4

5 回答 5

5

正如您发布的 StackOverflow 链接中的答案所示,您可以使用第二个参数indexOf来定义搜索在字符串中的开始位置。您可以使用此技术继续遍历字符串,以获取所有匹配子字符串的索引:

function getMatchIndexes(str, toMatch) {
    var toMatchLength = toMatch.length,
        indexMatches = [], match,
        i = 0;

    while ((match = str.indexOf(toMatch, i)) > -1) {
        indexMatches.push(match);
        i = match + toMatchLength;
    }

    return indexMatches;
}

console.log(getMatchIndexes("asdf asdf asdf", "as"));

演示:http: //jsfiddle.net/qxERV/

另一种选择是使用正则表达式来查找所有匹配项:

function getMatchIndexes(str, toMatch) {
    var re = new RegExp(toMatch, "g"),
        indexMatches = [], match;

    while (match = re.exec(str)) {
        indexMatches.push(match.index);
    }

    return indexMatches;
}

console.log(getMatchIndexes("asdf asdf asdf", "as"));

演示:http: //jsfiddle.net/UCpeY/

还有一个选择是手动循环遍历字符串的字符并与目标进行比较:

function getMatchIndexes(str, toMatch) {
    var re = new RegExp(toMatch, "g"),
        toMatchLength = toMatch.length,
        indexMatches = [], match,
        i, j, cur;

    for (i = 0, j = str.length; i < j; i++) {
        if (str.substr(i, toMatchLength) === toMatch) {
            indexMatches.push(i);
        }
    }

    return indexMatches;
}

console.log(getMatchIndexes("asdf asdf asdf", "as"));

演示:http: //jsfiddle.net/KfJ9H/

于 2013-06-03T13:34:02.560 回答
2

可能是一个解决方案:

http://jsfiddle.net/HkbpY/

var str = 'some kind of text with letter e in it',
    letter = 'e',
    indexes = [];

$.each(str.split(''),function(i,v){
    if(v === letter) indexes.push(i);
});

console.log(indexes);
于 2013-06-03T13:37:48.343 回答
1

检查这个...

var data = 'asd 111 asd 222 asd 333';
var count = countOccurence('asd', data);
console.info(count);
function countOccurence(item, data, count){
    if (count == undefined) { count = 0; }
    if (data.indexOf(item) != -1)
    {
        count = count+1;
        data = data.substring(data.indexOf(item) + item.length);
        count = countOccurence(item, data, count);
    }
    return count;
}
于 2013-06-03T13:38:00.467 回答
0
var mystring = 'hello world';
var letterToCount = 'l';

var indexes = [];
for(var i=0; i<mystring.length; i++) {
    if(mystring[i] == letterToCount)
       indexes.push(i); 
}

alert(indexes.join(',')); //2,3,9
于 2013-06-03T13:26:01.030 回答
0

像这样试试

var str = "foodfoodfoodfooooodfooooooood";
for (var index = str.indexOf("o");index > 0; index = str.indexOf("o", index+1)){
console.log(index);
}

看演示

于 2013-06-03T13:27:52.560 回答