Inserir string na posição x de outra string

237

Eu tenho duas variáveis ​​e preciso inserir string bem string ano ponto representado por position. O resultado que estou procurando é "Quero uma maçã". Como posso fazer isso com JavaScript?

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

Respostas:

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


Opcional: Como um método de protótipo de String

O seguinte pode ser usado para emendar textdentro de outra string em um desejado index, com um removeCountparâmetro opcional .

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

jAndy
fonte
3
Para seqüências longas, essa solução é mais rápida (porque copia menos) que a solução da nickf.
pts
35
Esta solução não é mais rápida. Fiquei curioso sobre isso e executei um jsperf. Esta é uma observação para quem ler isso no futuro. jsperf.com/javascript-string-splice . Testado no mais recente FF / Chrome / IE10 / IE9. Eu usaria a abordagem do lean nickf sobre esta para clareza e desempenho.
Junkyspace
3
Bem, isso é muito possível. A resposta aqui tem quase 3 anos, a maioria dos navegadores e versões da época, realmente teve um desempenho muito mais rápido com uma junção de matriz (especialmente o IE).
precisa saber é
1
Peço desculpas por ter revivido uma pergunta tão antiga, mas pelo que valho a pena, deve var output = [a.slice(0, position + 1), b, a.slice(position)].join('');dar aos OPs "Quero uma maçã", em vez de "Quero uma maçã".
paulvs
13
@PaulVon Nunca é errado corrigir algo, por isso não há necessidade de perdoar. Enfim, eu meio que discordo. O funcionalmente faz o que se destina a fazer, insira uma string em uma determinada posição dentro de outra string. Na verdade, a string inserida deve ser como "an", o que seria mais correto nesse caso.
precisa
262
var output = a.substring(0, position) + b + a.substring(position);

Editar: substituído .substrpor .substringporque .substragora é uma função herdada (por https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )

nickf
fonte
47
De acordo com @junkyspace jsperf.com/javascript-string-splice , essa resposta é 640x mais rápida que a de jAndy.
Paulo Coghi - Restabelece Monica 8/16
5
String.prototype.substrestá obsoleto agora. developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
Tivie
2
substring neste caso, é uma substituição directa para o obsoleto substr, então a resposta é: var output = a.substring(0, position) + b + a.substring(position);.
Seafish
Não é estritamente obsoleto, mas legado, por isso uma boa idéia para substituir como ele provavelmente vai se tornar obsoleto, e é recomendado por MDN para uso.substring
froggomad
32

Você pode adicionar esta função à classe de string

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

para que você possa usá-lo em qualquer objeto string:

var my_string = "abcd";
my_string.insertAt(1, "XX");
jasin_89
fonte
3
É uma prática recomendada modificar o protótipo de objeto nativo: stackoverflow.com/questions/14034180/…
jhujhul 15/18
10

O uso de literais de seqüência de caracteres ES6 seria muito mais curto:

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'

Stefan J
fonte
9

Talvez seja ainda melhor se você determinar a posição usando indexOf () assim:

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

então chame a função assim:

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

Observe que eu coloquei um espaço após o "an" na chamada de função, em vez de na declaração de retorno.

paulo62
fonte
2
Não foi isso que foi pedido. Mesmo se este era o caso este não iria funcionar se você tiver várias ocorrências do "at" substring
elachell
6

A biblioteca Underscore.String tem uma função que insere

insert (string, index, substring) => string

igual a

insert("Hello ", 6, "world");
// => "Hello world"
svarog
fonte
Não por mim, mas provavelmente porque não havia menção dessa biblioteca na pergunta. Mas ele também não parece excluir outras bibliotecas IMO ..
Dennis98
1
Mesmo que eu não gosto de usar bibliotecas menos que seja necessário, eu upvoted para compensar o downvote: P
froggomad
3

experimentar

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

ou solução regexp

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

Kamil Kiełczewski
fonte
2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

Isso seria mais lento, mas cuidará da adição de espaço antes e depois do an. Além disso, você terá que alterar o valor da posição (para 2, agora é mais intuitivo)

Ravindra Sane
fonte
2

Conserto rápido! Se você não quiser adicionar um espaço manualmente, faça o seguinte:

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

(edit: vejo que isso é realmente respondido acima, desculpe!)

K. Yu
fonte
2

Se o lookback do ES2018 estiver disponível , mais uma solução de regexp, que o utiliza para "substituir" em uma posição de largura zero após o caractere N-ésimo (semelhante ao do @Kamil Kiełczewski, mas sem armazenar os caracteres iniciais em um grupo de captura):

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

dlauzon
fonte
1

Bem, apenas uma pequena alteração, porque a solução acima é exibida

"Eu quero uma maçã"

ao invés de

"Eu quero uma maçã"

Para obter a saída como

"Eu quero uma maçã"

use o seguinte código modificado

var output = a.substr(0, position) + " " + b + a.substr(position);
Clyde Lobo
fonte
13
sim, provavelmente não é desejável neste caso, mas adicionar um espaço extra automaticamente quase definitivamente não é desejável em todos os casos.
nickf
12
Não as soluções corretas ser adicionar os espaços na string = 'um', desta forma você pode reutilizar a função
Tosh