> 웹 프론트엔드 > JS 튜토리얼 > string.indexOf() 내부

string.indexOf() 내부

DDD
풀어 주다: 2025-01-17 08:27:08
원래의
117명이 탐색했습니다.

string.indexOf() under the hood

안녕하세요, 개발자 여러분!

오늘은 indexOf() 메소드를 처음부터 구현해 보았습니다. 지금까지 다음을 찾았습니다.

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    // 调整起始索引,如果它是负数
    if (start < 0) {
        start = string.length + start;
    }

    // 确保起始索引在字符串长度范围内
    if (start < 0) {
        start = 0;
    } else if (start >= string.length) {
        return -1; // 目标索引超出字符串范围
    }

    // 循环遍历字符串
    for (let i = start; i <= string.length - l; i++) {
        if (string.substring(i, i + l) === target) {
            return i; // 找到目标子串
        }
    }

    return -1; // 未找到目标子串
}</code>
로그인 후 복사

코드 설명:

indexOf() 메소드는 세 가지 매개변수를 허용합니다:

  1. string: 검색할 문자열입니다.
  2. target: 찾을 하위 문자열입니다.
  3. start: 검색이 시작되는 인덱스입니다(기본값 0).

첫 번째 시도:

처음 아이디어는 간단했습니다. 문자열을 반복하면서 string[i] === target를 찾으면 i을 반환하는 것이었습니다. 루프 끝에서 일치하는 항목이 없으면 -1이 반환됩니다. 코드는 다음과 같습니다.

<code class="language-javascript">// 此方法仅适用于单个字符的目标</code>
로그인 후 복사

그러나 이 방법은 문자별로 비교하기 때문에 target이 단일 문자인 경우에만 작동합니다.

두 번째 시도:

그러다가 target가 한 문자보다 길면 하위 문자열을 비교해야 한다는 것을 깨달았습니다. 저는 substr()과 길이가 같은 하위 문자열을 비교하기 위해 target 메서드를 사용합니다. 문자열에 비교할 문자가 충분히 남아 있으면 루프가 중지되도록 조정됩니다.

<code class="language-javascript">// 此方法处理多字符目标,但未处理start参数</code>
로그인 후 복사

세 번째 시도:

다음으로 음수일 수 있는 start 매개변수를 처리해야 합니다. 내장 indexOf() 메소드는 start가 음수일 때 string.length start부터 검색을 시작합니다. 예를 들어 문자열 길이가 10이고 start가 -4인 경우 검색은 인덱스 6(예: 10 - 4)에서 시작됩니다.

이 문제를 해결하기 위해 음수 start 값을 처리하도록 코드를 업데이트했습니다.

<code class="language-javascript">function myIndexOf(string, target, start = 0) {
    let l = target.length;

    if (start < 0) {
        start = string.length + start;
    }

    // ... (其余代码与第二次尝试相同)
}</code>
로그인 후 복사

최종 버전:

호기심에서 문자열 길이보다 큰 start 값을 처리하고 싶었기 때문에 start가 문자열 길이를 초과하면 계속해서 "줄바꿈"하도록 함수를 수정하기로 결정했습니다. 끈. 이렇게 하면 함수는 래핑 후에 적절한 인덱스에서 계속 검색합니다. 최종 솔루션은 다음 공식을 사용하여 시작 인덱스를 조정합니다.

<code class="language-javascript">start = (string.length + start) % string.length;</code>
로그인 후 복사

작동 방식:

  • 모듈로 연산자start % string.lengthstart가 -string.length에서 string.length 범위에 있는지 확인합니다.
  • 부정적인 결과가 긍정적인 결과가 되도록 string.length을 추가했습니다.
  • 의 마지막 모듈로 연산은 start의 값이 래핑되어 유효한 인덱스 범위 내에 속하는지 확인합니다.

다음에는 선형 검색 대신 이진 검색을 사용하고 싶은데 어떻게 생각하시나요?

위 내용은 string.indexOf() 내부의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿