2011-12-21 18 views
5

Mam ciąg miesięcy i lat:JavaScript: split ciąg w 2d tablicy

var months= "2010_1,2010_3,2011_4,2011_7"; 

Chcę, aby ten w 2d tablicy z roku na pierwszej pozycji w każdej tablicy i miesiąca, w druga pozycja. Innymi słowy, chcę skończyć z tym:

var monthArray2d = [[2010,1],[2010,3][2011,4],[2011,7]]; 

Sposób, w jaki to zrobić aktualnie jest:

//array of selected months 
var monthArray = months.split(","); 

//split each selected month into [year, month] array 
var monthArray2d = new Array(); 
for (var i = 0; i < monthArray.length; i++) { 
    monthArray2d[i] = monthArray[i].split("_"); 

Czy istnieje sposób, aby skondensować ten kod tak, że nigdy nie trzeba używać monthArray var?

Odpowiedz

9

Można użyć replace dostać kod bardziej kompaktowa:

var months= "2010_1,2010_3,2011_4,2011_7"; 
var monthArray2d = [] 

months.replace(/(\d+)_(\d+)/g, function($0, $1, $2) { 
    monthArray2d.push([parseInt($1), parseInt($2)]); 
}) 

lub map czy Twoja przeglądarka obsługuje cel:

monthArray2d = months.split(",").map(function(e) { 
    return e.split("_").map(Number); 
}) 
3

JavaScript jest innym dynamicznym językiem, a jego typ zmiennej pozwala zachować wszystko, co chcesz. Zrobiłeś podział, teraz po prostu podzielisz ten ciąg z _ i umieścisz go tam.

Zobacz ten przykład:

var months= "2010_1,2010_3,2011_4,2011_7"; 

var monthArray = months.split(","); 

for (var i = 0; i < monthArray.length; i++) { 
    monthArray[i] = monthArray[i].split("_"); 
} 

console.log(monthArray); 

nie wiem co masz na myśli, aby nie używać monthArray. Powyższy kod jest prawdopodobnie najmniejszy z możliwych!

4

Jeśli skrapla się co jesteś po:

var month_array = months.split(",").map(function(x){return x.split("_")}); 
1

Dzielenie każdego podziału jest rozsądne - można użyć wyrażenia regularnego, aby dopasować numery podkreślenia oddzielone, i wstawić każdą parę w swojej tablicy popychany do miesiąca array-

ale nie widzę poprawę w stosunku kodzie:

var s= "2010_1,2010_3,2011_4,2011_7", 

A= [], rx=/(\d+)_(\d+)/g; 

while((M= rx.exec(s))!= null){ 
    A.push([M[1], M[2]]); 
} 


/* returned value: (Array) 
[[2010,1],[2010,3],[2011,4],[2011,7]] 
*/