25

文字列内の文字のn番目の出現を見つけるためにJavaScriptコードに取り組んでいます。このindexOf()関数を使用して、文字の最初の出現を取得できます。ここでの課題は、キャラクターのn番目の出現を取得することです。以下のコードを使用して、2番目と3番目のオカレンスを取得することができました。

function myFunction() {
  var str = "abcdefabcddesadfasddsfsd.";

  var n = str.indexOf("d");
  document.write("First occurence " +n );

  var n1 = str.indexOf("d",parseInt(n+1));
  document.write("Second occurence " +n1 );

  var n2 = str.indexOf("d",parseInt(n1+1));
  document.write("Third occurence " +n2 );

  var n3 = str.indexOf("d",parseInt(n2+1));
  document.write("Fourth occurence " +n3);

  // and so on ...
}

結果を以下に示します。

First occurence 3 
Second occurence 9 
Third occurence 10 
Fourth occurence 14 
Fifth occurence 18 
Sixth occurence 19

上記のコードではスクリプトをn回繰り返す必要があるため、スクリプトを一般化して、文字のn番目の出現箇所を見つけられるようにします。同じことをするためのより良い方法または代替案があるかどうか私に知らせてください。その文字のインデックスを取得するために(実行時に)オカレンスを与えるだけでよいと思います。

以下は私の質問の一部です。

  • JavaScriptでそれをどのように行うのですか?
  • 同じ実装をより簡単な方法で実行する機能を提供するフレームワークはありますか、それとも他のフレームワーク/言語で同じ実装を行うための代替方法は何ですか?
4

6 に答える 6

24
function nth_occurrence (string, char, nth) {
    var first_index = string.indexOf(char);
    var length_up_to_first_index = first_index + 1;

    if (nth == 1) {
        return first_index;
    } else {
        var string_after_first_occurrence = string.slice(length_up_to_first_index);
        var next_occurrence = nth_occurrence(string_after_first_occurrence, char, nth - 1);

        if (next_occurrence === -1) {
            return -1;
        } else {
            return length_up_to_first_index + next_occurrence;  
        }
    }
}

// Returns 16. The index of the third 'c' character.
nth_occurrence('aaaaacabkhjecdddchjke', 'c', 3);
// Returns -1. There is no third 'c' character.
nth_occurrence('aaaaacabkhjecdddhjke', 'c', 3);
于 2012-10-05T11:22:05.440 に答える
14

charAt()次のように、を使用して関数を実装することで、簡単に実行できます。

function nth_ocurrence(str, needle, nth) {
  for (i=0;i<str.length;i++) {
    if (str.charAt(i) == needle) {
        if (!--nth) {
           return i;    
        }
    }
  }
  return false;
}

alert( nth_ocurrence('aaaaacabkhjecdddchjke', 'c', 3)  );//alerts 16

OPが本当に望んでいたことを教えてくれたCQQLに感謝します。新しい動作を実現するために、元の関数を少し更新しました。

于 2012-10-05T11:15:30.280 に答える
8

indexOfは、検索を開始するための2番目の引数である文字列内の文字インデックスを取ります。

function nthChar(string, character, n){
    var count= 0, i=0;
    while(count<n && (i=string.indexOf(character,i)+1)){
        count++;
    }
    if(count== n) return i-1;
    return NaN;
}

var s= 'abcbbasdbgasdnnaabaasdert';

nthChar(s,'a',7);
于 2012-10-05T13:57:02.983 に答える
2

したがって、これを行うための良い方法は、次のように文字列クラスを拡張することです。

(function() {
  String.prototype.nthOccurrenceIndex = function(charToMatch, occurrenceIndex) {
    var char, index, matches, _i, _len;
    matches = 0;
    index = 0;
    for (_i = 0, _len = this.length; _i < _len; _i++) {
      char = this[_i];
      if (char === charToMatch) {
        matches += 1;
        if (matches === occurrenceIndex) {
          return index;
        }
      }
      index += 1;
    }
    return -1;
  };

}).call(this);

はるかに簡潔なCoffeeScriptバージョン:

String.prototype.nthOccurrenceIndex = (charToMatch, occurrenceIndex)->
  matches = 0
  index = 0

  for char in @
    if char is charToMatch
      matches += 1

      return index if matches is occurrenceIndex

    index += 1

  -1

これで、次のようなことができます。

"abcabc" .nthOccurrenceIndex('a'、1)
#-> 0

"abcabc" .nthOccurrenceIndex('a'、2)
#-> 3

"abcabc" .nthOccurrenceIndex('a'、3)
#-> -1

于 2014-09-15T09:02:30.633 に答える
2

多分より明確な機能。再帰的で、次のメカニズムをコピーしますindexOf

  • n番目の数値が正しくない場合(つまり<= 0)、エラーは発生しません。-1に対して負の数(または文字列の長さより大きい)を指定できるように返さfromIndexindexOfます。
  • 引数を取ることができfromIndexます(と同じindexOf検索を開始するインデックスを表す整数。デフォルト値は0です。

function indexOfNth (string, char, nth, fromIndex=0) {
  let indexChar = string.indexOf(char, fromIndex);
  if (indexChar === -1){
    return -1;
  } else if (nth === 1) {
    return indexChar;
  } else {
    return indexOfNth(string, char, nth-1, indexChar+1);
  }
}


let test = 'string for research purpose';
console.log('first s:', indexOfNth(test, 's', 1));
console.log('second s:', indexOfNth(test, 's', 2));
console.log('15th s:', indexOfNth(test, 's', 15));
console.log('first z:', indexOfNth(test, 'z', 1));
console.log('-1th s:', indexOfNth(test, 's', -1));
console.log('first s starting from index=1:', indexOfNth(test, 's', 1, 1));

于 2019-08-01T06:26:36.007 に答える
0
function nthIndexOf(search, n) {
    var myArray = []; 
    for(var i = 0; i < myStr.length; i++) {
        if(myStr.slice(i, i + search.length) === search) {
            myArray.push(i);            
        }
    }   
    return myArray[n - 1];
}
于 2016-05-31T15:05:00.843 に答える