javascript - palabra - Insertar una cadena en un índice específico
indexof javascript (13)
¿Cómo puedo insertar una cadena en un índice específico de otra cadena?
var txt1 = "foo baz"
Supongamos que quiero insertar "barra" después de "foo" ¿cómo puedo lograr eso?
Pensé en la substring()
, pero debe haber una forma más simple y directa.
Básicamente, esto es lo que está haciendo @ Bass33, excepto que también doy la opción de usar un índice negativo para contar desde el final. Algo así como el método substr permite.
// use a negative index to insert relative to the end of the string.
String.prototype.insert = function (index, string) {
var ind = index < 0 ? this.length + index : index;
return this.substring(0, ind) + string + this.substring(ind, this.length);
};
Caso de uso: digamos que tiene imágenes de tamaño completo utilizando una convención de nomenclatura pero no puede actualizar los datos para proporcionar también urls de miniaturas.
var url = ''/images/myimage.jpg'';
var thumb = url.insert(-4, ''_thm'');
// result: ''/images/myimage_thm.jpg''
Dado su ejemplo actual, podría lograr el resultado ya sea por
var txt2 = txt1.split('' '').join('' bar '')
o
var txt2 = txt1.replace('' '', '' bar '');
pero dado que puede hacer tales suposiciones, también puede pasar directamente al ejemplo de Gullen.
En una situación en la que realmente no puede hacer suposiciones que no estén basadas en el índice de caracteres, entonces me gustaría una solución de subcadena.
La inserción en un índice específico (en lugar de, digamos, en el primer carácter de espacio) tiene que usar la segmentación / subcadena de cadena:
var txt2 = txt1.slice(0, 3) + "bar" + txt1.slice(3);
Otra solución, cortar la cadena en 2 y poner una cadena en el medio.
var str = jQuery(''#selector'').text();
var strlength = str.length;
strf = str.substr(0 , strlength - 5);
strb = str.substr(strlength - 5 , 5);
jQuery(''#selector'').html(strf + ''inserted'' + strb);
Podrías prototipar tu propio splice()
en String.
Relleno de polietileno
if (!String.prototype.splice) {
/**
* {JSDoc}
*
* The splice() method changes the content of a string by removing a range of
* characters and/or adding new characters.
*
* @this {String}
* @param {number} start Index at which to start changing the string.
* @param {number} delCount An integer indicating the number of old chars to remove.
* @param {string} newSubStr The String that is spliced in.
* @return {string} A new string with the spliced substring.
*/
String.prototype.splice = function(start, delCount, newSubStr) {
return this.slice(0, start) + newSubStr + this.slice(start + Math.abs(delCount));
};
}
Ejemplo
String.prototype.splice = function(idx, rem, str) {
return this.slice(0, idx) + str + this.slice(idx + Math.abs(rem));
};
var result = "foo baz".splice(4, 0, "bar ");
document.body.innerHTML = result; // "foo bar baz"
EDIT: se modificó para garantizar que rem
es un valor absoluto.
Prueba esto. Aquí hay un método que escribí que se comporta como todos los otros lenguajes de programación.
String.prototype.insert = function (index, string) {
if (index > 0)
return this.substring(0, index) + string + this.substring(index, this.length);
else
return string + this;
};
Ejemplo de uso:
var something = "How you?";
something = something.insert(3, " are");
Simples.
Referencia: http://coderamblings.wordpress.com/2012/07/09/insert-a-string-at-a-specific-index/
Puedes usar expresiones regulares con un patrón dinámico .
var text = "something";
var output = " ";
var pattern = new RegExp("^//s{"+text.length+"}");
var output.replace(pattern,text);
salidas:
"something "
Esto reemplaza text.length
de los espacios en blanco al principio de la output
de la cadena. El RegExp
significa ^/
- al comienzo de una línea cualquier carácter de espacio en blanco, repetida {n}
veces, en este caso text.length
. Utilice //
para /
escapar de barras diagonales al crear este tipo de patrones de cadenas.
Sé que este es un hilo antiguo, sin embargo, aquí hay un enfoque realmente efectivo.
var tn = document.createTextNode("I am just to help")
t.insertData(10, "trying");
Lo bueno de esto es que obliga al contenido del nodo. Entonces, si este nodo ya estuviera en el DOM, no necesitaría utilizar ningún selector de consulta o actualizar el texto interior. Los cambios se reflejarían debido a su ligadura.
Si necesitara una cadena, simplemente acceda a la propiedad de contenido de texto del nodo.
tn.textContent
#=> "I am just trying to help"
Si alguien está buscando una manera de insertar texto en múltiples índices en una cadena, pruebe esto:
String.prototype.insertTextAtIndices = function(text) {
return this.replace(/./g, function(character, index) {
return text[index] ? text[index] + character : character;
});
};
Por ejemplo, puede usar esto para insertar etiquetas <span>
en ciertas compensaciones en una cadena:
var text = {
6: "<span>",
11: "</span>"
};
"Hello world!".insertTextAtIndices(text); // returns "Hello <span>world</span>!"
Simplemente haga la siguiente función:
function insert(str, index, value) {
return str.substr(0, index) + value + str.substr(index);
}
y luego usarlo así
alert(insert("foo baz", 4, "bar "));
Salida: foo bar baz
Se comporta exactamente, como el C # (Sharp) String.Insert (int startIndex, valor de cadena).
NOTA: Esta función de inserción inserta el valor de la cadena (tercer parámetro) antes del índice entero especificado (segundo parámetro) en la cadena str (primer parámetro), y luego devuelve la nueva cadena sin cambiar la cadena .
ACTUALIZACIÓN 2016: Aquí hay otra función prototipo solo por diversión (¡pero más seria!) Basada en el enfoque RegExp
una sola línea (con soporte prepend en index
undefined
o negativo):
/**
* Insert `what` to string at position `index`.
*/
String.prototype.insert = function(what, index) {
return index > 0
? this.replace(new RegExp(''.{'' + index + ''}''), ''$&'' + what)
: what + this;
};
console.log( ''foo baz''.insert(''bar '', 4) ); // "foo bar baz"
console.log( ''foo baz''.insert(''bar '') ); // "bar foo baz"
Solución anterior (de regreso a 2012) solo por diversión :
var index = 4,
what = ''bar '';
''foo baz''.replace(/./g, function(v, i) {
return i === index - 1 ? v + what : v;
}); // "foo bar baz"
function insertString(string, insertion, place) {
return string.replace(string[place] + string[place + 1], string[place] + insertion + string[place + 1])
}
Entonces, para ti, sería insertString("foo baz", "bar", 3);
Obviamente, esta sería una pintura para usar porque tienes que suministrar tu cadena a la función cada vez, pero en este momento no sé cómo convertirla en algo más fácil como una string.replace(insertion, place)
. Sin embargo, la idea sigue en pie.
my_string = "hello world";
my_insert = " dear";
my_insert_location = 5;
my_string = my_string.split('''');
my_string.splice( my_insert_location , 0, my_insert );
my_string = my_string.join('''');