Función para cortar un string por palabras

publicado por: Anonymous

La siguiente función corta un string, solo se debe ingresar el texto, el inicio y final.

La función es la siguiente:

 Generator.prototype.splitbywords = function (variable, start, length) {
    var s = variable,
        len = s.length,
        posStart = Math.max(0, start == 0 ? 0 : s.indexOf(' ', start)),
        posEnd = Math.max(0, length > len ? len : s.indexOf(' ', length));
    return s.substr(posStart, posEnd);
};

La función funciona bien casi siempre, pero no tiene contemplado algunos casos y me gustaría que me ayudaran.

Estos son los casos:


  1. Si no existe el último espacio

para el siguiente texto:

“PayPal, tu entrada al mercado internacional” (cadena de 44
caracteres)

No esta retornando nada, para la función:

splitbywords("PayPal, tu entrada al mercado internacional",0,40)

Y la razón es que no encuentra el último espacio luego del largo 40

s.indexOf(' ', length)
  1. Que no retorne la coma “,”

También deseo que no corte el texto después de una coma, y el problema esta en la misma linea:

posEnd = Math.max(0, length > len ? len : s.indexOf(' ', length));

ya que estoy consultando por un espacio " " y no una coma ", ". Traté de solucionar esto cambiando esta linea por:

posEnd = Math.max(0, length >= len ? len : (s.charAt(s.substr(posStart, s.indexOf(' ', length)) - 1) = "," ? s.indexOf(', ', length): s.indexOf(' ', length));

Pero sigue retornando la coma y no entiendo que hice mal.

He agregado algunos de prueba:

string = "Hola amigos ¿como están?"

splitbywords(string, 0, 10)
Retorna: "Hola amigos"
CORRECTO

splitbywords(string, 0, 20)
Retorna: ""
PROBLEMA ya que espero que retorne todo el texto

======================

string = "Hola Julio, estoy bien"

splitbywords(string, 0, 10)
Retorna: "Hola Julio,"
PROBLEMA, no quiero que retorne la coma ","

splitbywords(string, 0, 15)
Retorna: "Hola Julio, estoy"
CORRECTO

=====================

EDITO2:
El código queda de así:

function splitbywords(variable, empieza, termina) {
   var s = variable+' ',   // resuelve problema 1
      largo = s.length,
      posStart = Math.max(0, empieza == 0 ? 0 : s.indexOf(' ', empieza)),
      posEnd = Math.max(0, termina > largo ? largo : s.indexOf(' ', termina)),
      cadena = s.substr(posStart, posEnd);
  if (cadena.charAt(cadena.length-1) === ',') {     //resuelve problema 2
      cadena = cadena.substr(0, cadena.length-1);
  }
  return cadena;
}

_x000D_

_x000D_

function splitbywords(variable, empieza, termina) {_x000D_
  var s = variable+' ',_x000D_
      largo = s.length,_x000D_
      posStart = Math.max(0, empieza == 0 ? 0 : s.indexOf(' ', empieza)),_x000D_
      posEnd = Math.max(0, termina > largo ? largo : s.indexOf(' ', termina)),_x000D_
      cadena = s.substr(posStart, posEnd);_x000D_
  if (cadena.charAt(cadena.length-1) === ',') {_x000D_
      cadena = cadena.substr(0, cadena.length-1);_x000D_
  }_x000D_
  return cadena;_x000D_
}_x000D_
_x000D_
let text1 = "PayPal, tu entrada al mercado internacional";_x000D_
let text2 = "Hola Julio, estoy bien";_x000D_
_x000D_
document.getElementById("demo1").innerHTML = splitbywords(text1, 0 , 25);_x000D_
document.getElementById("demo2").innerHTML = splitbywords(text1, 0 , 30);_x000D_
document.getElementById("demo3").innerHTML = splitbywords(text2, 0 , 8);_x000D_
document.getElementById("demo4").innerHTML = splitbywords(text2, 0 , 15);

_x000D_

<!DOCTYPE html>_x000D_
<html>_x000D_
<body>_x000D_
_x000D_
<h1>JavaScript splitbywords</h1>_x000D_
_x000D_
<p>Ejemplos:</p>_x000D_
_x000D_
<p id="demo1"></p>_x000D_
<p id="demo2"></p>_x000D_
<p id="demo3"></p>_x000D_
<p id="demo4"></p>_x000D_
</body>_x000D_
</html>

_x000D_

_x000D_

_x000D_

solución

Primero, creo sería más práctico para éste caso usar substring en lugar de substr.

El método substring obtiene una subcadena donde el final (índice) está determinado por el segundo parámetro. Por otro lado, en el método substr, el segundo parámetro especifica la cantidad de caracteres a tomar desde una posición inicial.

Yo veo que haces cálculos bastante inncesarios. Por ejemplo, en el problema donde el índice para el final supera el tamaño del texto, por defecto, la función substring por defecto devuelve desde el inicio, hasta el final del texto. El problema de la coma, puede resolverse solo haciendo un condicional:

if (text.chartAt(end - 1) === ',') {
  _end--;
}

Menoramos una unidad porque el método substring te devuelve desde X hasta N - 1.

_x000D_

_x000D_

/**_x000D_
 * Divide un texto dada un inicio y un final._x000D_
 * Si el final es una coma, se excluye meno-_x000D_
 * rando una unidad al final._x000D_
 */_x000D_
function extract (text, start, end) {_x000D_
  let _end = end;_x000D_
  if (text.charAt(end - 1) === ',') {_x000D_
    _end--;_x000D_
  }_x000D_
  return text.substring(start, _end);_x000D_
}_x000D_
_x000D_
let text1 = "Hola amigos ¿como están?";_x000D_
let text2 = "Hola Julio, estoy bien";_x000D_
_x000D_
console.log('Prueba 1: de 0 a 10: ', extract(text1, 0 , 10));_x000D_
console.log('Prueba 2: de 0 a 20: ', extract(text1, 0 , 20));_x000D_
console.log('Prueba 3: de 0 a 10: ', extract(text2, 0 , 10));_x000D_
console.log('Prueba 4: de 0 a 15: ', extract(text2, 0 , 15));

_x000D_

_x000D_

_x000D_

También puedes jugar con expresiones regulares para detectar o reemplazar ciertos caracteres como comas, espacios, etc. Queda a tu creatividad.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *