3

文字列をループして特定の文字のすべてのインデックスを見つける最も効率的な方法を見つけようとしています。

以前$word_or_phrase.indexOf( $letter );は文字の 1 つのインデックスを見つけていましたが、その文字は$word_or_phrase複数回見つかりました。.indexOfこれを行う最も効率的な方法は、 -1 が返されるまですべてのインデックスの配列を作成することでしょうか? または、すべてのインデックスを見つける方法を教えてください。

私はすでに時間をかけてこれを見つけました: Javascript str.search() 複数のインスタンス

これは機能しますが、2 つ以上のインデックスを扱う場合は効率的ではないようです。10個だったら?

事前にアドバイスをありがとう!

4

5 に答える 5

5

投稿したStackOverflowリンクの回答が示すように、の2番目のパラメーターを使用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 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 に答える