2015-09-02 12 views
7

Mam wartość ciągu ("11112233"). Chcę podzielić ten ciąg i podzielić go na 3 różne wartości.Podział ciągu na podstawie powtórzeń

Val 1 = 1111 
val 2 = 22  
val 3 = 33 

Szukałem dużo, jego możliwości z postaciami takimi jak (/) lub innymi symbolami. Coś innego, mój numer jest zawsze inny, więc nie mogę go podzielić, wprowadzając dokładny ciąg znaków. chcę zrobić coś takiego:

var myVal = "11112233"; 
var lastVal = myVal.split(0 , 3); // split from index 0 till index 3 

W jaki sposób można to zrobić?
Dzięki

+0

Po prostu możesz zrobić to w ten sposób "11112233" .split (/ (1+ | 2+ | 3 +) /). ale trzeba poprawić regex. – Raghavendra

Odpowiedz

15

Spróbuj tego wyrażenia regularnego:

'121112233'.match(/(\d)\1*/g) // ["1", "2", "111", "22", "33"] 

\1* oznacza "Tak jak poprzednim meczu, zero lub więcej razy".

2

Istnieje funkcja substr().

Można go używać jak napisałeś w swoim pytaniu:

var myVal = "11112233"; 
var lastVal = myVal.substr(0, 3); // "1111" 
+1

Właściwie to pytanie jest dość niejasne, mówiąc "coś takiego". Nadal jest prawidłową odpowiedzią imho. – mik01aj

+0

To też działa. Dzięki. – Mehran

4

Spróbuj jak to

myVal='11112233' 
myVal.match(/(\d)\1+/g); //["1111", "22", "33"] 
3

Można użyć obiektu rozwiązać ten problem.

var str = '11112233'; 

var strObj = {}; 

for(var i = 0; i < str.length; i++){ 
    if(strObj[str[i]]) { 
     strObj[str[i]]+=str[i]; 
    } else { 
     strObj[str[i]] = str[i]; 
    } 
} 

for (var key in strObj) { 
    if (strObj.hasOwnProperty(key)) { 
    alert(key + " -> " + strObj[key]); 
    } 
} 

JsFiddle: https://jsfiddle.net/nikdtu/7qj3szo2/

+0

Dzięki. To też działa. – Mehran

+0

powinien być bardziej wydajny pod względem złożoności czasu i przestrzeni. –

+0

Nie jestem pewien: http://jsperf.com/regexp-vs-hardcoded, o ile jsperf jest niezawodny :-D – leaf

2

celu uzupełnienia powyżej odpowiedzi, oto rozwiązanie nie za pomocą wyrażenia regularnego.

function partition(acc, value){ 

    var last = acc[acc.length-1]; 
    if(last && last[0] == value) acc[acc.length-1] += value; 
    else acc = acc.concat(value); 

    return acc; 
} 

var toInt = parseInt.bind(null, 10) 

var x = ([[]]).concat("112233".split('')) 
       .reduce(partition).map(toInt); 

// [11, 22, 33]