2013-10-17 19 views
11

Ich habe eine Ajax-Anforderung, die eine Liste von Werten wie folgt zurückgibt:Elegante Möglichkeit, eine Reihe von Array Arrays in ein Javascript Array von Arrays zu konvertieren?

"[-5, 5, 5], [-6, 15, 15], [7, 13, 12]" 

Ich brauche es ein JavaScript-Array mit Zahlen zu sein:

[[-5, 5, 5], [-6, 15, 15], [7, 13, 12]] 

Ich versuchte, das ‚[‘ zu ersetzen und ']' für ein '|' und dann durch '|' und foreach Element geteilt durch "," und fügen Sie sie zu einem Array, aber das ist nicht elegant überhaupt.

Haben Sie irgendwelche Vorschläge?

+2

elegant definieren? Die meisten String-Manipulationen sind nicht wirklich hübsch. –

+0

Die Verwendung von Split + For-Schleife, wo vielleicht Match würde tun, ist wahrscheinlich nicht elegant oder hübsch. ;-) – RobG

Antwort

17

können Sie JSON.parse() verwenden diese Zeichenfolge in ein Array zu konvertieren, solange Sie es in einigen Klammern manuell zuerst wickeln:

var value = "[-5, 5, 5], [-6, 15, 15], [7, 13, 12]"; 
var json = JSON.parse("[" + value + "]"); 

console.log(json); 

Ich würde vorschlagen, die Ausgabe auf dem Server, wenn möglich, wenn auch zu korrigieren.

+1

Danke für die schnelle und elegante Antwort! – cesarferreira

+0

das ist hübsch, :) –

0

Wenn Sie die Daten sind zu erzeugen, und Sie ihm vertrauen, benutzen Sie einfach eval:

var string = "[-5, 5, 5], [-6, 15, 15], [7, 13, 12]" 

var arrays = eval('[' + string + ']'); 

Alternativ starten wohlgeformte JSON zurück.

+2

In vorher 'eval ist böse'. – meagar

+0

@upvoter Es gibt wirklich keinen guten Grund, 'eval' zu verwenden, wenn die Zeichenfolge * auch * gültig ist. JSON, bitte setzen Sie mich stattdessen ab. – meagar

+0

Sogar jQuery verwendet * eval *, also muss es in Ordnung sein, oder? – RobG

1

In einer Funktion

var strToArr = function(string){ return JSON.parse('[' + string + ']')} 

console.log(strToArr("[-5, 5, 5], [-6, 15, 15], [7, 13, 12]")); 
+0

Sollte diese Funktion nicht 'stringToArr' heißen? – Marty

+0

@MartyWallace oh, danke, geändert. – Felix

+1

Warum -1 ........? – Jashwant

1
var string = "[-5, 5, 5], [-6, 15, 15], [7, 13, 12]"; 
var arr = []; 
var tmp = string.split('], '); 

for (var i=0; i<tmp.length; i++) { 
    arr.push(tmp[i].replace(/\[|\]/g, '').split(', ')); 
} 

Typing auf meinem iPad so entschuldige ich mich im Voraus für alle Fehler.

2

Diese Lösung ist in der Praxis dumm - absolut verwenden JSON.parse wie andere gesagt haben - aber im Interesse der mit regulären Ausdrücken Spaß, hier gehen Sie:

function getMatches(regexp, string) { 
    var match, matches = []; 
    while ((match = regexp.exec(string)) !== null) 
    matches.push(match[0]); 
    return matches; 
} 

function parseIntArrays(string) { 
    return getMatches(/\[[^\]]+\]/g, string) 
    .map(function (string) { 
     return getMatches(/\-?\d+/g, string) 
     .map(function (string) { 
      return parseInt(string); 
     }); 
    }); 
} 

parseIntArrays("[-5, 5, 5], [-6, 15, 15], [7, 13, 12]");