2013-10-17 33 views
11

Tôi có một yêu cầu ajax mà trả về một danh sách các giá trị như thế này:Cách thanh lịch để chuyển đổi chuỗi mảng Mảng thành mảng Javascript của mảng?

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

tôi cần nó là một mảng javascript với những con số:

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

Tôi cố gắng để thay thế '[' và ']' cho một '|' và sau đó chia cho '|' và mục foreach chia cho ',' và thêm chúng vào một mảng, nhưng đây là không phải là thanh lịch chút nào.

Các bạn có bất kỳ đề xuất nào không?

+2

Xác định thanh lịch? Hầu hết các thao tác chuỗi không thực sự đẹp. –

+0

Sử dụng phân tách + cho vòng lặp nơi có thể phù hợp sẽ làm có thể không thanh lịch hoặc xinh đẹp. ;-) – RobG

Trả lời

17

Bạn có thể sử dụng JSON.parse() để chuyển đổi chuỗi thành một mảng, miễn là bạn bọc nó trong một số khung bằng tay đầu tiên:

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

console.log(json); 

tôi sẽ đề nghị điều chỉnh đầu ra tại máy chủ nếu có thể, mặc dù.

+1

Cảm ơn bạn đã trả lời nhanh và thanh lịch! – cesarferreira

+0

đẹp, :) –

0

Nếu bạn đang tạo ra các dữ liệu, và bạn tin tưởng nó, chỉ cần sử dụng eval:

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

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

Ngoài ra, bắt đầu trở về JSON well-formed.

+2

Trước 'eval là cái ác'. – meagar

+0

@upvoter Có thực sự không có lý do gì tốt để sử dụng 'eval' khi chuỗi là * cũng * JSON hợp lệ, xin vui lòng downvote tôi thay thế. – meagar

+0

Ngay cả jQuery sử dụng * eval * để nó phải được OK, phải không? – RobG

1

Trong một hàm

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

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

Không nên đặt tên hàm đó là 'stringToArr'? – Marty

+0

@MartyWallace oh, cảm ơn, đã thay đổi. – Felix

+1

Tại sao -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 trên iPad của tôi vì vậy tôi xin lỗi trước cho bất kỳ lỗi chính tả.

2

Giải pháp này là ngu ngốc trong thực tế - hoàn toàn sử dụng JSON.parse như những người khác đã nói - nhưng vì lợi ích của việc có vui vẻ với biểu thức thông thường, here you go:

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]"); 
Các vấn đề liên quan