2012-05-06 13 views
5

Me gustaría dividir una cadena en piezas de longitud fija (N, por ejemplo). Por supuesto, la última pieza podría ser más corta, si la longitud de la secuencia original no es múltiplo de N.Dividir una cadena de JavaScript en piezas de longitud fija

Necesito el método más rápido para hacerlo, pero también el más simple de escribir. La forma en que he estado haciendo hasta ahora es la siguiente:

var a = 'aaaabbbbccccee'; 
var b = []; 
for(var i = 4; i < a.length; i += 4){ // length 4, for example 
    b.push(a.slice(i-4, i)); 
} 
b.push(a.slice(a.length - (4 - a.length % 4))); // last fragment 

creo que debe haber una mejor manera de hacer lo que quiera. Pero no quiero módulos o bibliotecas adicionales, solo JavaScript simple si es posible.

Antes de preguntar, he visto algunas soluciones para resolver este problema usando otros lenguajes, pero no están diseñadas con JavaScript en mente.

+0

¿Realmente escribir todo lo que cada vez que fuera sólo para evitar una llamada de función? – Esailija

+0

¿Qué le hace pensar que puede tener la ejecución de código más rápida _y_ simplicidad de implementación? Esas dos cualidades a menudo compiten. –

+1

Aquí hay otra implementación, pero todavía muy similar a la tuya: http://phpjs.org/functions/str_split:530 – Niko

Respuesta

17

Puede probar esto:

var a = 'aaaabbbbccccee'; 
var b = a.match(/(.{1,4})/g); 
+1

¡Muy simple! ¡Me gusta! Pero, ¿qué sucede si la longitud fija es 32, por ejemplo? Tendría que escribir '/ (. {32} |. {31} |. {30} ... |. {2} |.)/G'. ¡Demasiado texto! – sgmonda

+2

Aún más corto: 'a.match (/ (. {1,4})/g);' – Niko

+0

Probablemente usaría '[\ S \ s]' o similar sobre '.' ya que incluye cada carácter – Esailija

4

Ver esta pregunta relacionada: (. Ver prueba de rendimiento en los comentarios si el rendimiento es un problema) https://stackoverflow.com/a/10456644/711085 y https://stackoverflow.com/a/8495740/711085

primer enlace (más lento):

[].concat.apply([], 
    a.split('').map(function(x,i){ return i%4 ? [] : a.slice(i,i+4) }) 
) 

Como prototipo de cadena:

String.prototype.chunk = function(size) { 
    return [].concat.apply([], 
     this.split('').map(function(x,i){ return i%size ? [] : this.slice(i,i+size) }, this) 
    ) 
} 

Demostración:

> '123412341234123412'.chunk(4) 
["1234", "1234", "1234", "1234", "12"] 
+0

Ahora que la respuesta de la expresión regular no requiere escribir '/ (. {32} |. {31} |. {30} .................. .......... |. {2} |.)/G', tendría que recomendar esa respuesta, ya que es muy conciso. =) Esta solución es mejor solo para fragmentar matrices. – ninjagecko

+0

Esto parece perfecto para el mismo problema, pero se aplica a las matrices. ¡Gracias! Para spliting cadenas prefiero la solución anterior. – sgmonda

+0

Puede que le interese esta comparación: http://jsperf.com/chunk-methods –

Cuestiones relacionadas