다른 문자열의 x 위치에 문자열 삽입


237

두 개의 변수가 있으며 로 표시된 지점에서 문자열 b에 문자열 을 삽입해야합니다 . 내가 찾은 결과는 "사과를 원합니다"입니다. JavaScript로 어떻게 할 수 있습니까?aposition

var a = 'I want apple';
var b = ' an';
var position = 6;

답변:


376

var a = "I want apple";
var b = " an";
var position = 6;
var output = [a.slice(0, position), b, a.slice(position)].join('');
console.log(output);


선택 사항 : String의 프로토 타입 방법으로

다음은 text원하는 다른 문자열 내 에서 스플 라이스하는 데 사용할 수 있습니다index 선택적 removeCount매개 변수 .

if (String.prototype.splice === undefined) {
  /**
   * Splices text within a string.
   * @param {int} offset The position to insert the text at (before)
   * @param {string} text The text to insert
   * @param {int} [removeCount=0] An optional number of characters to overwrite
   * @returns {string} A modified string containing the spliced text.
   */
  String.prototype.splice = function(offset, text, removeCount=0) {
    let calculatedOffset = offset < 0 ? this.length + offset : offset;
    return this.substring(0, calculatedOffset) +
      text + this.substring(calculatedOffset + removeCount);
  };
}

let originalText = "I want apple";

// Positive offset
console.log(originalText.splice(6, " an"));
// Negative index
console.log(originalText.splice(-5, "an "));
// Chaining
console.log(originalText.splice(6, " an").splice(2, "need", 4).splice(0, "You", 1));
.as-console-wrapper { top: 0; max-height: 100% !important; }


3
긴 문자열의 경우이 솔루션은 nickf 솔루션보다 빠릅니다 (복사본이 적기 때문에).
pts

35
이 솔루션은 빠르지 않습니다. 나는 이것에 대해 궁금했고 jsperf를 실행했습니다. 이것은 앞으로 이것을 읽는 사람에게 참고할 것입니다. jsperf.com/javascript-string-splice . 최신 FF / Chrome / IE10 / IE9에서 테스트되었습니다. 나는 명확성과 성능 모두를 위해이 방법에 대한 린닉 (lean nickf) 접근법을 사용할 것이다.
junkyspace

3
글쎄, 그건 매우 가능합니다. 여기에 대한 답변은 거의 3 세이며, 대부분의 브라우저와 버전은 실제로 Array join (특히 IE) 으로 더 빠르게 수행되었습니다 .
jAndy

1
나는 당신의 용서가 그런 오래된 질문을 되살려달라고 간청하지만, 가치가있는 var output = [a.slice(0, position + 1), b, a.slice(position)].join('');것은 OP에게 "사과를 원합니다"대신 "사과를 원합니다"를주는 것입니다.
paulvs

13
@PaulVon 무언가를 고치는 것은 결코 잘못이 아니므로 용서할 필요가 없습니다. 어쨌든, 나는 동의하지 않습니다. 기능적으로 의도 된 작업을 수행하고 다른 문자열 내의 특정 위치에 문자열을 삽입하십시오. 실제로 삽입 된 문자열은 "an"과 같아야하며이 경우 더 정확합니다.
jAndy

262
var output = a.substring(0, position) + b + a.substring(position);

편집 : 교체 .substr.substring인해는 .substr이제 기존의 함수이다 (당 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
@junkyspace jsperf.com/javascript-string-splice 에 따르면 이 답변은 jAndy보다 640 배 빠릅니다 .
Paulo Coghi-복원 모니카

5
String.prototype.substr더 이상 사용되지 않습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie

2
substring 이 경우 더 이상 사용되지 않는을 대체 substr하므로 대답은 다음과 같습니다 var output = a.substring(0, position) + b + a.substring(position);.
Seafish

그것은 엄격하게되지 아니에요,하지만 좋은 아이디어가 대체 할 수 있도록 기존, 그것은 가능성이되지 않는 될 것 같은, 및 사용에 MDN에 의해 추천.substring
froggomad

32

이 함수를 문자열 클래스에 추가 할 수 있습니다

String.prototype.insert_at=function(index, string)
{   
  return this.substr(0, index) + string + this.substr(index);
}

모든 문자열 객체에서 사용할 수 있습니다.

var my_string = "abcd";
my_string.insertAt(1, "XX");

3
: 기본 객체의 프로토 타입을 수정하는 나쁜 관행입니다 stackoverflow.com/questions/14034180/...
jhujhul

10

ES6 문자열 리터럴을 사용하면 훨씬 짧습니다.

const insertAt = (str, sub, pos) => `${str.slice(0, pos)}${sub}${str.slice(pos)}`;
    
console.log(insertAt('I want apple', ' an', 6)) // logs 'I want an apple'


9

다음 과 같이 indexOf ()를 사용하여 위치 를 결정하면 더 좋습니다 .

function insertString(a, b, at)
{
    var position = a.indexOf(at); 

    if (position !== -1)
    {
        return a.substr(0, position) + b + a.substr(position);    
    }  

    return "substring not found";
}

다음과 같이 함수를 호출하십시오.

insertString("I want apple", "an ", "apple");

return 문이 아니라 함수 호출에서 "an"뒤에 공백을 넣었습니다.


2
이것은 요청 된 것이 아닙니다. 이 경우에도 "at"하위 문자열이 여러 번 발생하면 작동하지 않습니다
elachell

6

Underscore.String의 도서관이 수행하는 기능이 삽입

insert (string, index, substring) => 문자열

그렇게

insert("Hello ", 6, "world");
// => "Hello world"

나에 의해 아니라, 아마도 질문에 그 라이브러리에 대한 언급이 없기 때문에. 그러나 그는 또한 다른 도서관 IMO를 배제하지 않는 것 같습니다.
Dennis98

1
P : 내가하지 않는 한 필요한 라이브러리를 사용하여 싫어하더라도, 나는 downvote 오프셋 upvoted
froggomad

3

시험

a.slice(0,position) + b + a.slice(position)

또는 정규식 솔루션

"I want apple".replace(/^(.{6})/,"$1 an")


2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

이 속도는 느려 지지만 전후의 공간 추가를 처리합니다. 또한 위치 값을 변경해야합니다 (현재 2보다 직관적입니다).


2

빠른 수정! 공백을 수동으로 추가하지 않으려면 다음을 수행하십시오.

var a = "I want apple";
var b = "an";
var position = 6;
var output = [a.slice(0, position + 1), b, a.slice(position)].join('');
console.log(output);

(편집 : 이것이 실제로 위의 답변이라는 것을 알았습니다. 미안합니다!)


2

ES2018의 lookbehind를 사용할 수있는 경우 하나 이상의 정규식 솔루션으로 N 번째 문자 뒤의 너비0 인 위치 (@Kamil Kiełczewski와 유사하지만 초기 문자를 캡처 그룹에 저장하지 않음) 에서 "대체"합니다 .

"I want apple".replace(/(?<=^.{6})/, " an")


1

위의 솔루션 출력 때문에 작은 변화 만

"애플을 원해"

대신에

"사과를 원해"

출력을 다음과 같이 얻으려면

"사과를 원해"

다음 수정 된 코드를 사용하십시오

var output = a.substr(0, position) + " " + b + a.substr(position);

13
예, 경우에는 바람직하지 않지만 추가 공간을 자동으로 추가하는 것은 모든 경우 에 거의 바람직하지 않습니다 .
nickf

12
올바른 해결책은 문자열 = 'a'에 공백을 추가하는 것입니다. 이렇게하면 함수를 재사용 할 수 있습니다
Tosh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.