[javascript] 문자열에서 n 번째 발생을 얻는 방법?

다음과 같이 2nd발생 시작 위치를 얻고 ABC싶습니다.

var string = "XYZ 123 ABC 456 ABC 789 ABC";
getPosition(string, 'ABC', 2) // --> 16

어떻게 하시겠습니까?



답변

const string = "XYZ 123 ABC 456 ABC 789 ABC";

function getPosition(string, subString, index) {
  return string.split(subString, index).join(subString).length;
}

console.log(
  getPosition(string, 'ABC', 2) // --> 16
)


답변

배열을 만들지 않고 indexOf 문자열을 사용할 수도 있습니다.

두 번째 매개 변수는 다음 일치 항목을 찾기 시작하는 색인입니다.

function nthIndex(str, pat, n){
    var L= str.length, i= -1;
    while(n-- && i++<L){
        i= str.indexOf(pat, i);
        if (i < 0) break;
    }
    return i;
}

var s= "XYZ 123 ABC 456 ABC 789 ABC";

nthIndex(s,'ABC',3)

/*  returned value: (Number)
24
*/


답변

kennebec의 답변을 바탕으로 n 번째 발생이 0이 아닌 -1을 반환하는 프로토 타입 함수를 만들었습니다.

String.prototype.nthIndexOf = function(pattern, n) {
    var i = -1;

    while (n-- && i++ < this.length) {
        i = this.indexOf(pattern, i);
        if (i < 0) break;
    }

    return i;
}


답변

재귀가 항상 답이기 때문입니다.

function getPosition(input, search, nth, curr, cnt) {
    curr = curr || 0;
    cnt = cnt || 0;
    var index = input.indexOf(search);
    if (curr === nth) {
        if (~index) {
            return cnt;
        }
        else {
            return -1;
        }
    }
    else {
        if (~index) {
            return getPosition(input.slice(index + search.length),
              search,
              nth,
              ++curr,
              cnt + index + search.length);
        }
        else {
            return -1;
        }
    }
}


답변

다음은 n일치 항목이 발견 될 때까지 문자열을 반복하는 솔루션입니다 .

String.prototype.nthIndexOf = function(searchElement, n, fromElement) {
    n = n || 0;
    fromElement = fromElement || 0;
    while (n > 0) {
        fromElement = this.indexOf(searchElement, fromElement);
        if (fromElement < 0) {
            return -1;
        }
        --n;
        ++fromElement;
    }
    return fromElement - 1;
};

var string = "XYZ 123 ABC 456 ABC 789 ABC";
console.log(string.nthIndexOf('ABC', 2));

>> 16


답변

이 메서드는 배열에 저장된 n 번째 항목의 인덱스를 호출하는 함수를 만듭니다.

function nthIndexOf(search, n) {
    var myArray = [];
    for(var i = 0; i < myString.length; i++) { //loop thru string to check for occurrences
        if(myStr.slice(i, i + search.length) === search) { //if match found...
            myArray.push(i); //store index of each occurrence           
        }
    }
    return myArray[n - 1]; //first occurrence stored in index 0 
}


답변

더 짧고 불필요한 문자열을 만들지 않고 더 쉽게 생각합니다.

const findNthOccurence = (string, nth, char) => {
  let index = 0
  for (let i = 0; i < nth; i += 1) {
    if (index !== -1) index = string.indexOf(char, index + 1)
  }
  return index
}