2012-05-24 39 views
7

Tôi có chuỗi sauchuyển đổi một chuỗi để javascript đối tượng

":All;true:Yes;false:&nbsp" 

Tôi muốn chuyển đổi là một đối tượng như:

var listItems = 
[ 
{itemValue: "", itemText: "All"}, 
{itemValue: true, itemText: "Yes"}, 
{itemValue: false, itemText: "&nbsp"} 
]; 

Bất kỳ cách thanh lịch để làm điều này đánh giá cao.

Trả lời

12

Với true/false hỗ trợ boolean:

var listItems = []; 
var yourString = ":All;true:Yes;false:&nbsp"; 

var arr = yourString.split(";"); 
for (var i = 0; i < arr.length; i++) { 
    var arr2 = arr[i].split(":"); 
    var value = arr2[0] || ""; 
    if (value == "true" || value == "false") 
     value = (value === "true"); 
    listItems.push({ 
     itemValue : value, 
     itemText : arr2[1] || "" 
    }); 
} 

console.log(listItems); 

DEMO:http://jsfiddle.net/MZKFU/1/


UPDATE. Để phân tích giá trị phổ dụng, bạn có thể sử dụng phương thức JSON.parse với khối try/catch, như được trình bày trong Esailija's answer.

DEMO:http://jsfiddle.net/MZKFU/2/

+0

Bạn có thể muốn làm cho rằng 'var arr2 = arr [i] .split (":", 1) 'sẽ cho phép các giá trị bao gồm dấu hai chấm. –

+0

Tuyệt vời, nhưng chúng tôi cũng phải xử lý "true" và "false": Chúng tôi không muốn chúng xuất hiện dưới dạng chuỗi trong JSON kết quả, nhưng dưới dạng boolean. –

+0

@GarethMcCaughan Nó sẽ chỉ hoạt động nếu chúng ta có giá trị ở bên phải :) – VisioN

6
var str = ":All;true:Yes;false:&nbsp"; 
var listItems = str.split(/[;:]/g).map(function(v, i, arr){ 
    var itemValue; 
    if(i % 2) { 
     return; 
    } 

    try { 
     itemValue = JSON.parse(v); 
    } 
    catch(e) { 
     itemValue = v; 
    } 

    return { 
     itemValue: itemValue, 
     itemText: arr[i + 1] 
    }; 
}).filter(Boolean); 

Kết quả:

[ 
Object 
itemText: "All" 
itemValue: "" 
__proto__: Object 
, 
Object 
itemText: "Yes" 
itemValue: true 
__proto__: Object 
, 
Object 
itemText: "&nbsp" 
itemValue: false 
__proto__: Object 
] 
+0

Giải pháp thông minh. –

+0

Giải pháp tốt nhất. 'xấu' bản đồ xấu hổ của nó không được sử dụng nhiều hơn trong javascript. Sự hỗ trợ của nó trong tất cả các trình duyệt chính trong một thời bây giờ là – Dve

+0

Giải pháp thực sự thông minh! Tuy nhiên nó không thành công nếu bạn có bất kỳ chuỗi hoặc số nào làm giá trị. Nhưng nó có thể dễ dàng xử lý. – VisioN

2
var string = ":All;true:Yes;false:&nbsp"; 
var array = string.split(/:|;/); 

var listItems = []; 

for (var i = 0; i < array.length; i += 2) { 
    listItems.push({itemValue: array[i], itemText: array[i + 1]}) 
} 

Chú ý rằng điều này sẽ thiết lập "false" và "true" như chuỗi. Tương tự cho số nếu bạn có nó. Nếu bạn muốn lưu chúng với các loại thích hợp, bạn phải thêm chuyển đổi thủ công. Một cái gì đó như:

function value(val) { 
    if (!isNaN(val)) 
     return +val; 

    if (val === "true") 
     return true; 

    if (val === "false") 
     return false; 

    return val; 
} 

Do đó dòng đẩy đối tượng vào mảng sẽ thay đổi như sau:

listItems.push({itemValue: value(array[i]), itemText: array[i + 1]}) 
1
var myString = ":All;true:Yes;false:&nbsp"; 
var myArray = myString.split(';'); 
var literal = []; 
for(var i = 0; i<myArray.length; i++){ 
    var mixed_string = myArray[i]; 
    var changed_array = mixed_string.split(":"); 
    var key = changed_array[0]; 
    var value = changed_array[1]; 
    literal.push({key:value}); 
} 
console.log(literal); 

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