2013-10-17 10 views
11

mam żądania AJAX, która zwraca listę wartości tak:Elegancki sposób na konwersję ciągu Array of Arrays na tablicę JavaScript z tablicami?

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

muszę go mieć javascript tablicę z numerami:

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

Próbowałem zastąpić „[” i "]" dla "|" a następnie podzielone przez "|" i foreach element podzielony przez "," i dodać je do tablicy, ale to wcale nie jest eleganckie.

Czy macie jakieś sugestie?

+2

Definiowanie elegancki? Większość manipulacji ciągami nie jest naprawdę ładna. –

+0

Używanie split + dla pętli, w której być może mecz byłby prawdopodobnie nie elegancki lub ładny. ;-) – RobG

Odpowiedz

17

Można użyć JSON.parse() przekonwertować ciąg do tablicy, tak długo, jak owinąć go w niektórych nawiasach ręcznie pierwszy:

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

console.log(json); 

Proponuję korygowania wyjście na serwerze, jeśli to możliwe, choć.

+1

Dzięki za szybką i elegancką reakcję! – cesarferreira

+0

To jest ładne, :) –

0

Jeśli generowania danych, a ty go zaufaniem, wystarczy użyć eval:

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

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

Ewentualnie rozpocząć powrocie dobrze uformowaną JSON.

+2

Wcześniej "eval jest złe". – meagar

+0

@upvoter Naprawdę nie ma żadnego powodu, aby używać 'eval', gdy ciąg znaków jest * również * poprawny JSON, proszę, zamiast tego. – meagar

+0

Nawet jQuery używa * eval *, więc musi być OK, prawda? – RobG

1

W zależności

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

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

Czy ta funkcja nie powinna być nazywana 'stringToArr'? – Marty

+0

@MartyWallace oh, dzięki, zmieniłem. – Felix

+1

Dlaczego -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(', ')); 
} 

pisania na moim iPadzie, więc z góry przepraszam za ewentualne literówki.

2

Rozwiązanie to jest głupie w praktyce - absolutnie wykorzystać JSON.parse jak mówili inni - ale w interesie zabawy z wyrażeń regularnych, tutaj przejść:

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]"); 
Powiązane problemy