Подтвердить что ты не робот

Поиск n-го вхождения символа в строку в javascript

Я работаю над кодом javascript, чтобы найти n-ое вхождение символа в строку. Используя функцию indexOf(), мы можем получить первое вхождение символа. Теперь задача состоит в том, чтобы получить n-ое появление символа. Мне удалось получить второе третье появление и т.д., Используя приведенный ниже код:

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

Я хотел бы обобщить script, чтобы я смог найти n-ое вхождение символа, так как приведенный выше код требует повторения script n раз. Сообщите мне, есть ли лучший способ или альтернатива сделать то же самое. Было бы неплохо, если бы мы просто дали возможность (во время выполнения) получить индекс этого символа.

Ниже приведены некоторые из моих вопросов:

  • Как это сделать в JavaScript?
  • Предоставляет ли какая-либо инфраструктура какие-либо функциональные возможности для упрощения реализации одной и той же реализации или альтернативные методы для ее реализации в других фреймворках/языках?
4b9b3361

Ответ 1

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);

Ответ 2

Вы можете сделать это легко, реализовав функцию с помощью 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

Благодаря CQQL, дайте мне знать, что действительно нужно OP. Я немного обновил свою оригинальную функцию для достижения нового поведения.

Ответ 3

indexOf принимает второй аргумент, индекс символа в строке, чтобы начать поиск.

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);

Ответ 4

Итак, хороший способ сделать это - расширить класс строки следующим образом:

(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

Ответ 5

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];
}