2010-09-09 28 views

Trả lời

11

tôi thường sử dụng phương pháp "search and don't replace":

var ret = {}, 
    str = "param1:'test1' && param2:'test2'"; 

str.replace(/(\b[^:]+):'([^']+)'/g, function ($0, param, value) { 
    ret[param] = value; 
}); 

JSON.stringify(ret); 
// -> { "param1": "test1", "param2":"test2" } 

Ví dụ: http://jsfiddle.net/bcJ9s/

+1

+1: Điều này mạnh hơn một chút so với đề xuất của tôi. Vẫn có thể được cải thiện; nếu có dấu cách giữa dấu và dấu hai chấm, nó được bao gồm trong mã định danh. :) – Guffa

+0

Điều quan trọng, ở đây, là liệu bạn có thể dự đoán định dạng của 'chuỗi' lên phía trước, để làm cho regexp càng đơn giản càng tốt. Điều này sẽ giúp bảo trì, trong tương lai, nhưng có lẽ nên được ghi chép ở đâu đó, để cho rõ ràng những giả thiết là gì. – belugabob

4

Chừng nào nó ở định dạng đó, tức là chỉ có giá trị chuỗi (và chuỗi không chứa " && " hoặc dấu hai chấm), bạn có thể dễ dàng phân tích nó:

var params = theString.split(' && '); 
var map = {}; 
for (var i = 0; i < params.length; i++) { 
    var parts = params[i].split(':'); 
    map[parts[0]] = parts[1].substr(1, parts[1].length - 2); 
} 

Lưu ý rằng các dây là tất nhiên vẫn Strings: { param: 'test1', param2: 'test2' }

1

Sử dụng chuỗi chế biến (Như đã đề cập bởi @Guffa, nó sẽ thất bại nếu chuỗi tự chứa && hoặc :):

var str="param1:'test1' && param2:'test2'"; 
var map={}; 
var pairs=str.split('&&'); 
for(i=0, total=pairs.length; i<total; i++) { 
    var pair=pairs[i].trim().split(':'); 
    map[pair[0]]=pair[1].substr(1, pair[1].length-2); 
} 

Lưu ý: trim() không có sẵn trên các trình duyệt cũ, bạn cần để thêm bit mã này trước một mã ở trên [src]:

if (!String.prototype.trim) { 
    String.prototype.trim = function() { 
     return this.replace(/^\s*(\S*(?:\s+\S+)*)\s*$/, "$1"); 
    }; 
} 
+0

Mặc dù nó không thành công với các giá trị như '" param1: 'test: 1' && param2: 'test && 2' "' ... – Guffa

+0

Bạn nói đúng, tôi nghĩ về điều đó nhưng đọc những gì bạn đã nói ở trên câu trả lời của bạn vì vậy tôi nghĩ ai đó khác đề cập đến điều này tôi không phải, nhưng tôi proabably nên chỉnh sửa đề cập đến điều này quá, cảm ơn. – aularon

1

Sử dụng hàm string.split để ngắt chuỗi thành các phần mà bạn cần - một cái gì đó như thế này ...

var input = "param1:'test1' && param2:'test2'"; 
var entries = input.split(" && "); 
var map = {}; 
var pattern = /'/g; 
for(var i=0; i < entries.length; i++){ 
    var tokens = entries[i].split[":"]; 
    map[tokens[0]] = tokens[1].replace(pattern, ""); 
} 
+0

Khá hài lòng khi thấy rằng những người khác đã đến gần như chính xác cùng một giải pháp - cần phải dành một chút thời gian để hiểu câu trả lời được cung cấp bởi Andy E, vì tôi chưa bao giờ thấy string.replac được sử dụng với một hàm làm tham số thứ hai. Có lẽ Andy E có thể mở rộng câu trả lời của mình vì lợi ích của những người khác như tôi. – belugabob

+0

Mặc dù nó không thành công với các giá trị như '" param1: 'test: 1' && param2: 'test && 2' "' ... – Guffa

+0

nó rất giống với regex * exec() *, ngoại trừ không có vòng lặp và bạn đặt tên cho các ảnh chụp phụ trong sự đóng kín riêng của chúng. Đó là lý do tại sao tôi liên kết với bài viết mà John Resig đặt ra thuật ngữ và giải thích phương pháp :-) –

Các vấn đề liên quan