Quiero reemplazar texto entre dos índices en Javascript, algo así como:

str = "The Hello World Code!";
str.replaceBetween(4,9,"Hi");
//outputs "The Hi World Code"

Los índices y la cadena son dinámicas.

¿Cómo podría hacer esto?

InformationsquelleAutor kqlambert | 2013-02-14

6 Comentarios

  1. 61

    No existe tal método en JavaScript. Pero siempre puedes crear tu propio:

    JS:

    String.prototype.replaceBetween = function(start, end, what) {
      return this.substring(0, start) + what + this.substring(end);
    };
    
    console.log("The Hello World Code!".replaceBetween(4, 9, "Hi"));

    • +1, me llevó más tiempo de averiguar bastante mucho la misma!
    • OTOH, la posibilidad de espacio de nombres de la colisión es insignificante con este método el nombre 😉
    • Pero tengo preocupación acerca de referencia creado cada vez cuando una cadena se crea un objeto. Creo que sería completamente seguro si se agrega a un espacio de nombres independiente como método de utilidad. Estoy equivocado?
    • referencia de qué? Las referencias de función son baratos, y sólo uno de ellos podrá ser creado. La función no ser clonado, o incluso una referencia a él. No creo que la ampliación de String.prototype hará que la creación de la no-primitivos objetos de Cadena en el motor de javascript internamente.
  2. 7

    Hay un Array.empalme método en JavaScript que se encarga de este trabajo, pero no String.splice. Si usted convertir la cadena en una matriz, sin embargo:

    var str = "The Hello World Code!";
    var arr = str.split('');
    var removed = arr.splice(4,5,"Hi"); //arr is modified
    str = arr.join('');
    • Tenga en cuenta que mientras que es posible llamar a Array.splice en una cadena, no actuar como deseado debido a que las cadenas son inmutables.
    • Él no está usando splice en una cadena. Él es la creación de una nueva matriz que contiene todos los caracteres individuales llamando split(''), a continuación, confiando en los efectos secundarios del uso de splice en dicha matriz (la eliminación de los caracteres de la matriz), y, finalmente, costuras de nuevo juntos en una nueva cadena llamando a join(''). Yo diría que este es un muy intuitiva respuesta para las personas familiarizadas con los métodos que se utilizan. Pero no es la más corta o la más eficiente.
    • Entiendo que este post ha sido un rato. Actualmente split y join no funcionan muy bien con muchos emoji (como 😀)
  3. 1

    Esta es la forma en que trabajó para mí.

    var str = "The Hello World Code!";
    var newStr="Hi"
    
    var startIndex= 4;  //start index of 'H' from 'Hello'
    var endIndex= 8; //end index of 'o' from 'Hello'
    var preStr = str.substring(0, startIndex);
    var postStr = str.substring(endIndex+1, str.length - 1);
    var result = preStr+newStr+postStr;);     //outputs "The Hi World Code"

    violín: http://jsfiddle.net/ujvus6po/1/

  4. 0

    Otro enfoque cuando usted necesita para reemplazar por completo de una cuerda en un índice específico, con la misma llamada a la función con String.prototype.replace podría ser esta:

    String.prototype.replaceAt = function(index, fromString, toString) {
        let hasWrongParams = typeof index !== 'number'
                    || !fromString || typeof fromString !== 'string'
                    || !toString || typeof toString !== 'string';
        if(hasWrongParams) return '';
        let fromIndex = index;
        let toIndex = index + fromString.length;
        return this.substr(0, fromIndex) + toString + this.substr(toIndex);
    }

    https://gist.github.com/kwnccc/9df8554474e39f4b17a07efbbdf7971c

    Por ejemplo:

    let string = 'This is amazing world, it's still amazing!';
    string.replaceAt(8, 'amazing', 'worderful');
    //'This is worderful world, it's still amazing!'
    string.replaceAt(34, 'amazing', 'worderful');
    //'This is amazing world, it's still worderful!'
  5. 0

    Una versión más robusta de La visión del solución que detecta fuera de rango errores y lanza significativo y fácil de depuración RangeErrors. Si lo desea, puede ampliar la String.prototype así.

    JS:

    function replaceString(str, start, end, replace) {
      if (start < 0 || start > str.length) {
        throw new RangeError(`start index ${start} is out of the range 0~${str.length}`);
      }
      if (end > str.length || end < start) {
        throw new RangeError(`end index ${end} is out of the range ${start}~${str.length}`);
      }
      return str.substring(0, start) + replace + str.substring(end);
    }
    
    //replace in the middle of the string, replacement string can be any length
    console.log(replaceString("abcdef", 2, 4, "hhhh")); //output: "abhhhhef"
    
    //insert in the front of the string, start and end index equal to 0
    console.log(replaceString("abcdef", 0, 0, "hhhh")); //output: "hhhhabcdef"
    
    //append at the end of the string, start and end index equal to the length of the string
    console.log(replaceString("abcdef", 6, 6, "hhhh")); //output: "abcdefhhhh"
    
    //error 1: start index is greater than end index
    //console.log(replaceString("abcdef", 4, 2, "hhhh")); //output: RangeError: end index 2 is out of the range 4~6
    
    //error 2: start/end index is less than 0
    //console.log(replaceString("abcdef", -2, 2, "hhhh")); //output: RangeError: start index -2 is out of the range 0~6
    
    //error 3: start/end index is greater than length of the string
    //console.log(replaceString("abcdef", 3, 20, "hhhh")); //output: RangeError: end index 20 is out of the range 3~6

  6. 0

    La aceptada respuesta es correcta, pero yo quería evitar la ampliación de la Cadena prototype:

    function replaceBetween(origin, startIndex, endIndex, insertion) {
      return origin.substring(0, startIndex) + insertion + origin.substring(endIndex);
    }

    Uso:

    replaceBetween('Hi World', 3, 7, 'People');
    
    //Hi People

Dejar respuesta

Please enter your comment!
Please enter your name here