2012-05-06 20 views
5

Chciałbym podzielić ciąg na fragmenty o stałej długości (np. N). Oczywiście ostatni fragment może być krótszy, jeśli oryginalna długość napisu nie jest wielokrotnością N.Podział łańcucha JavaScript na kawałki o stałej długości

Potrzebuję najszybszej metody, aby to zrobić, ale także najprostszy do napisania. Sposób, w jaki robią to do tej pory jest następujący:

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 

myślę, że musi być lepszy sposób, aby robić to, co chcę. Ale nie chcę dodatkowych modułów ani bibliotek, wystarczy prosty JavaScript, jeśli jest to możliwe.

Zanim zapytam, widziałem kilka sposobów rozwiązania tego problemu przy użyciu innych języków, ale nie są one zaprojektowane z myślą o JavaScript.

+0

Czy naprawdę wszystko napisać, że z każdym razem po prostu, aby uniknąć wywołania funkcji? – Esailija

+0

Co sprawia, że ​​myślisz, że możesz mieć najszybsze wykonanie kodu i prostotę implementacji? Te dwie cechy często konkurują. –

+1

Oto kolejna implementacja, ale nadal bardzo podobna do twojej: http://phpjs.org/functions/str_split:530 – Niko

Odpowiedz

17

Można spróbować to:

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

Bardzo proste! Lubię to! Ale co się stanie, jeśli np. Stała długość wynosi 32? Musiałbym napisać '/ (. {32} |. {31} |. {30} ... |. {2} |.)/G'. Za dużo tekstu! – sgmonda

+2

Jeszcze krótszy: 'a.match (/ (. {1,4})/g);' – Niko

+0

Prawdopodobnie użyłbym '[\ S \ s]' lub podobnego w stosunku do '.', ponieważ zawiera każdy znak. – Esailija

4

Zobacz ten powiązane pytanie: (. Patrz test wydajności w komentarzach, jeśli wydajność jest problemem) https://stackoverflow.com/a/10456644/711085 i https://stackoverflow.com/a/8495740/711085

Pierwsze (wolniej) link:

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

Jako prototyp łańcucha znaków:

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

Demo:

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

Teraz odpowiedź regex nie wymaga zapisu '/ (. {32} |. {31} |. {30} .................. .......... |. {2} |.)/G ", musiałbym zalecić tę odpowiedź, ponieważ jest bardzo zwięzła. =) To rozwiązanie jest lepsze tylko do dzielenia tablic. – ninjagecko

+0

To wydaje się być idealne dla tego samego problemu, ale stosowane do tablic. Dziękuję Ci! Do dzielenia łańcuchów preferuję powyższe rozwiązanie. – sgmonda

+0

Możesz być zainteresowany tym porównaniem: http://jsperf.com/chunk-methods –

Powiązane problemy