2012-05-24 15 views
7

Mam następujący ciągprzekonwertować ciąg JavaScript Object

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

chcę przekonwertować jest do obiektu jak:

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

Wszelkie elegancki sposób, aby w ten sposób docenione.

Odpowiedz

12

Z true/false logiczną wsparcia:

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. Do uniwersalnego analizowania wartości można użyć metody JSON.parse z blokiem try/catch, jak przedstawiono w Esailija's answer.

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

+0

Może chcesz zrobić, że 'var arr2 = arr [i] .split (":", 1) 'co pozwoli wartościom dołączyć dwukropki. –

+0

Wspaniale, ale musielibyśmy również obsłużyć "prawda" i "fałsz": nie chcemy, aby pojawiały się jako łańcuchy w wynikowym JSON, ale jako booleans. –

+0

@GarethMcCaughan Będzie działać tylko wtedy, gdy mamy wartość po prawej stronie :) – 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); 

Wynik:

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

Sprytne rozwiązanie. –

+0

Najlepsze rozwiązanie. jego "mapa" wstydu nie jest więcej używana w javascript. Już od pewnego czasu obsługuje wszystkie główne przeglądarki. – Dve

+0

Naprawdę sprytne rozwiązanie! Jednak zawiedzie, jeśli masz jakiś ciąg lub liczbę jako wartość. Ale można to łatwo obsłużyć. – 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]}) 
} 

Zauważ, że będzie to zestaw "false" i "prawda" jako ciąg. To samo dotyczy liczb, jeśli je masz. Jeśli chcesz je zapisać odpowiednimi typami, musisz dodać konwersję ręczną. Coś jak:

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

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

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

    return val; 
} 

Dlatego linia przesunąć obiekt do tablicy zmieni jak poniżej:

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); 

Powiązane problemy