Insertar cadena en la posición x de otra cadena

237

Tengo dos variables y necesito insertar una cadena ben una cadena aen el punto representado porposition . El resultado que estoy buscando es "Quiero una manzana". ¿Cómo puedo hacer esto con JavaScript?

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

Respuestas:

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 método prototipo de cadena

Lo siguiente se puede usar para empalmar textdentro de otra cadena a la deseada index, con un 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
fuente
3
Para cadenas largas, esta solución es más rápida (porque copia menos) que la solución de nickf.
pts
35
Esta solución no es más rápida. Tenía curiosidad sobre esto y corrí un jsperf. Esta es una nota para cualquiera que lea esto en el futuro. jsperf.com/javascript-string-splice . Probado en el último FF / Chrome / IE10 / IE9. Usaría el enfoque de Lean Nickf sobre este para mayor claridad y rendimiento.
junkyspace
3
Bueno, eso es muy posible. La respuesta aquí es de casi 3 años, la mayoría de los navegadores y versiones en aquel entonces, de hecho, funcionaron mucho más rápido con una combinación de Array (especialmente IE).
jAndy
1
Perdón por haber revivido una pregunta tan antigua, pero para lo que valgo debería ser var output = [a.slice(0, position + 1), b, a.slice(position)].join('');dar a los OP "Quiero una manzana", en lugar de "Quiero una manzana".
paulvs
13
@PaulVon Nunca está mal corregir algo, así que no hay necesidad de perdonar. De todos modos, estoy en desacuerdo. Funcionalmente hace lo que está destinado a hacer, insertar una cadena en una determinada posición dentro de otra cadena. En realidad, la cadena insertada debería ser como "an", lo que sería más correcto en este caso.
jAndy
262
var output = a.substring(0, position) + b + a.substring(position);

Editar: reemplazado .substrpor .substringporque .substrahora es una función heredada (por https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )

nickf
fuente
47
Según @junkyspace jsperf.com/javascript-string-splice , esta respuesta es 640 veces más rápida que la de jAndy.
Paulo Coghi - Restablece a Monica el
55
String.prototype.substrestá en desuso ahora. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie
2
substring en este caso es un reemplazo directo para la obsoleta substr, por lo que la respuesta es: var output = a.substring(0, position) + b + a.substring(position);.
Seafish
No es estrictamente obsoleto, sino heredado, por lo que es una buena idea reemplazarlo, ya que probablemente se volverá obsoleto, y MDN lo recomienda usar.substring
froggomad el
32

Puede agregar esta función a la clase de cadena

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

para que pueda usarlo en cualquier objeto de cadena:

var my_string = "abcd";
my_string.insertAt(1, "XX");
jasin_89
fuente
3
Es una mala práctica modificar el prototipo de objeto nativo: stackoverflow.com/questions/14034180/…
jhujhul
10

Usar literales de cadena ES6 sería mucho más corto:

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
fuente
9

Tal vez sea aún mejor si determina la posición usando indexOf () de esta manera:

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

luego llame a la función de esta manera:

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

Tenga en cuenta que pongo un espacio después de "an" en la llamada a la función, en lugar de en la declaración de retorno.

paulo62
fuente
2
Esto no es lo que se le pidió. Incluso si este fuera el caso, esto no funcionaría si tiene múltiples ocurrencias de la subcadena "at"
elachell
6

La biblioteca Underscore.String tiene una función que hace Insertar

insert (cadena, índice, subcadena) => cadena

al igual que

insert("Hello ", 6, "world");
// => "Hello world"
svarog
fuente
No por mí, sino probablemente porque no se mencionó esa biblioteca en la pregunta. Pero tampoco parece excluir otras bibliotecas IMO ..
Dennis98
1
Aunque no me gusta usar bibliotecas a menos que sea necesario, voté para compensar el
voto negativo
3

tratar

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

o solución regexp

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

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

Esto sería más lento, pero se encargará de agregar espacio antes y después de la an. Además, tendrá que cambiar el valor de la posición (a 2, ahora es más intuitivo)

Ravindra Sane
fuente
2

¡Arreglo rapido! Si no desea agregar un espacio manualmente, puede hacer esto:

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

(Editar: veo que esto realmente se respondió anteriormente, ¡lo siento!)

K. Yu
fuente
2

Si el lookbehind de ES2018 está disponible , una solución regexp más, que lo utiliza para "reemplazar" en una posición de ancho cero después del enésimo carácter (similar a @Kamil Kiełczewski, pero sin almacenar los caracteres iniciales en un grupo de captura):

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

dlauzon
fuente
1

Bueno, solo un pequeño cambio porque los resultados de la solución anterior

"Quiero una manzana"

en vez de

"Quiero una manzana"

Para obtener la salida como

"Quiero una manzana"

usa el siguiente código modificado

var output = a.substr(0, position) + " " + b + a.substr(position);
Clyde Lobo
fuente
13
sí, probablemente no sea deseable en este caso, pero agregar un espacio extra automáticamente casi definitivamente no es deseable en todos los casos.
nickf
12
¿No serían las soluciones correctas agregar los espacios en la cadena = 'an', de esta manera puede reutilizar la función
Tosh