[javascript] 현을 연결하는 방법이 있습니까?

Javascript splice는 배열에서만 작동합니다. 문자열에 대한 유사한 방법이 있습니까? 아니면 나만의 사용자 지정 함수를 만들어야합니까?

substr()substring()방법은 추출 된 문자열을 반환하고 원래 문자열을 수정하지 않습니다. 내가 원하는 것은 내 문자열에서 일부를 제거하고 변경 사항을 원래 문자열에 적용하는 것입니다. 또한 replace()인덱스에서 시작하여 다른 인덱스에서 끝나는 부분을 제거하고 싶기 때문에 메서드로 수행 할 수 있는 것과 똑같이이 메서드 가 작동하지 않습니다 splice(). 내 문자열을 배열로 변환하려고 시도했지만 이것은 깔끔한 방법이 아닙니다.



답변

다음과 같이 문자열을 두 번 슬라이스하는 것이 더 빠릅니다.

function spliceSlice(str, index, count, add) {
  // We cannot pass negative indexes directly to the 2nd slicing operation.
  if (index < 0) {
    index = str.length + index;
    if (index < 0) {
      index = 0;
    }
  }

  return str.slice(0, index) + (add || "") + str.slice(index + count);
}

다음과 같이 분할 후 조인 (Kumar Harsh의 방법)을 사용하는 것보다

function spliceSplit(str, index, count, add) {
  var ar = str.split('');
  ar.splice(index, count, add);
  return ar.join('');
}

두 가지 방법과 다른 두 가지 방법을 비교 하는 jsperf 가 있습니다. (jsperf는 몇 달 동안 다운되었습니다. 의견에 대안을 제안하십시오.)

재현 구현 기능 위의 코드 있지만 일반 의 기능 splice아스카 제시 한 경우의 코드 최적화는 (즉, 변형 된 문자열에 아무것도 첨가되지 않은) 다양한 방법의 상대적 성능을 변경하지 않는다.


답변

편집하다

이것은 물론 문자열을 “스플 라이스”하는 가장 좋은 방법은 아닙니다. 구현 방법에 대한 예제로 이것을 제공했습니다. 이는 split (), splice () 및 join ()에서 결함이 있고 매우 분명합니다. 훨씬 더 나은 구현을 위해 Louis의 방법을 참조하십시오 .


아니요,과 같은 것은 String.splice없지만 다음을 시도해 볼 수 있습니다.

newStr = str.split(''); // or newStr = [...str];
newStr.splice(2,5);
newStr = newStr.join('');

splice배열에서와 같은 기능 이 없다는 것을 알고 있으므로 문자열을 배열로 변환해야합니다. 곤경…


답변

다음은 더 나은 가독성 (IMHO)을 제공하는 멋진 작은 커리입니다.

두 번째 함수의 서명은 Array.prototype.splice메서드와 동일합니다 .

function mutate(s) {
    return function splice() {
        var a = s.split('');
        Array.prototype.splice.apply(a, arguments);
        return a.join('');
    };
}

mutate('101')(1, 1, '1');

이미 받아 들여진 답변이 있다는 것을 알고 있지만 이것이 유용하기를 바랍니다.


답변

Kumar / Cody와 Louis 방법에 대한 더 간단한 대안을 제공하고 싶습니다. 내가 실행 한 모든 테스트에서 Louis 방법만큼 빠르게 수행됩니다 (벤치 마크는 바이올린 테스트 참조).

String.prototype.splice = function(startIndex,length,insertString){
    return this.substring(0,startIndex) + insertString + this.substring(startIndex + length);
};

다음과 같이 사용할 수 있습니다.

var creditCardNumber = "5500000000000004";
var cardSuffix = creditCardNumber.splice(0,12,'****');
console.log(cardSuffix);  // output: ****0004

테스트 결과보기 :
https://jsfiddle.net/0quz9q9m/5/


답변

elclanrs 및 raina77ow의 의견에서만 해결 된 많은 혼란이있는 것 같으므로 명확한 답변을 게시하겠습니다.

설명

string.splice“에서 다음과 같이 예상 할 수 있습니다.

  • 최대 3 개의 인수 허용 : 시작 위치, 길이 및 (선택적으로) 삽입 (문자열)
  • 잘라낸 부분을 반환
  • 원래 문자열을 수정합니다.

문제는 문자열이 변경 불가능하기 때문에 3d 요구 사항을 충족 할 수 없다는 것입니다 (관련 : 1 , 2 ). 여기서 가장 헌신적 인 주석을 찾았습니다 .

JavaScript에서 문자열은 객체가 아닌 원시 값 유형입니다 ( spec ). 사실, ES5의, 그들은 나란히 5 값 유형 중 하나를있어 null, undefined, numberboolean. 문자열에 의해 할당 된 하지 참조 등으로 전달된다. 따라서 문자열은 불변 일뿐만 아니라 입니다. 문자열 "hello"을 변경 "world"하는 것은 지금부터 숫자 3이 숫자 4라고 결정하는 것과 같습니다.

따라서이를 고려하여 ” string.splice“항목 만 다음과 같이 예상 할 수 있습니다 .

  • 최대 2 개의 인수 허용 : 시작 위치, 길이 (문자열이 변경되지 않았으므로 삽입이 의미가 없음)
  • 잘라낸 부분을 반환

그것이 무엇을 하는가 substr; 또는,

  • 최대 3 개의 인수 허용 : 시작 위치, 길이 및 (선택적으로) 삽입 (문자열)
  • 수정 된 문자열을 반환합니다 (절단 부분없이 삽입).

다음 섹션의 주제입니다.

솔루션

최적화에 관심이 있다면 Mike의 구현을 사용해야 할 것입니다.

String.prototype.splice = function(index, count, add) {
    if (index < 0) {
        index += this.length;
        if (index < 0)
            index = 0;
    }
    return this.slice(0, index) + (add || "") + this.slice(index + count);
}

하지만 경계를 벗어난 인덱스를 처리하는 방법은 다를 수 있습니다. 필요에 따라 다음을 원할 수 있습니다.

    if (index < 0) {
        index += this.length;
        if (index < 0)
            index = 0;
    }
    if (index >= this.length) {
        index -= this.length;
        if (index >= this.length)
            index = this.length - 1;
    }

또는

    index = index % this.length;
    if (index < 0)
        index = this.length + index;

성능에 신경 쓰지 않는다면 Kumar의 제안을보다 간단하게 적용 할 수 있습니다.

String.prototype.splice = function(index, count, add) {
    var chars = this.split('');
    chars.splice(index, count, add);
    return chars.join('');
}

공연

연주의 차이는 현의 길이에 따라 크게 증가합니다. jsperf 길이가 10 인 문자열의 경우 후자의 솔루션 (분할 및 결합)이 이전 솔루션 (슬라이스 사용)보다 두 배 느리고 100 자 문자열의 경우 x5이고 1000 자 문자열의 경우 x50이며 Ops /에서 초 그것은 :

                      10 letters   100 letters   1000 letters
slice implementation    1.25 M       2.00 M         1.91 M
split implementation    0.63 M       0.22 M         0.04 M

10 글자에서 100 글자로 이동할 때 첫 번째와 두 번째 인수를 변경했습니다 (여전히 100 글자 테스트가 10 글자 테스트보다 빠르다는 사실에 놀랐습니다).


답변

단순히 문자열에 substr 을 사용하십시오.

전의.

var str = "Hello world!";
var res = str.substr(1, str.length);

결과 = 안녕하세요!


답변

따라서 문자열 프로토 타입에 splice 메서드를 추가하는 것은 사양에 투명하게 작동하지 않습니다.

하나를 확장 해 보겠습니다.

String.prototype.splice = function(...a){
    for(var r = '', p = 0, i = 1; i < a.length; i+=3)
        r+= this.slice(p, p=a[i-1]) + (a[i+1]||'') + this.slice(p+a[i], p=a[i+2]||this.length);
    return r;
}
  • 3 개의 args 그룹이 스플 라이스 스타일로 “삽입”합니다.
  • 3 개 이상의 args 그룹이있는 경우 특히 각 컷의 끝이 다음 시작이됩니다.
    • ‘0123456789’.splice (4,1,’fourth ‘, 8,1,’eighth ‘); // ‘0123fourth567eighth9’반환
  • 각 그룹의 마지막 인수를 삭제하거나 0으로 만들 수 있습니다 ( “삽입 할 항목 없음”으로 처리됨).
    • ‘0123456789’.splice (-4,2); // ‘0123459’반환
  • 마지막 그룹에서 첫 번째 인수를 제외한 모든 항목을 삭제할 수 있습니다 ( “첫 번째 인수 위치 이후 모두 잘라 내기”로 처리됨).
    • ‘0123456789’.splice (0,2, null, 3,1, null, 5,2,’/ ‘, 8); // ’24/7’반환
  • 여러 번 통과하면 왼쪽에서 오른쪽으로 순서를 직접 확인해야합니다!
  • 그리고 원하지 않는 경우 다음과 같이 사용해서는 안됩니다.
    • ‘0123456789’.splice (4, -3,’what? ‘); // “0123what? 123456789″반환