2012-05-24 23 views
7

tengo la siguiente cadenaconvertir una cadena en javascript objeto

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

Quiero convertir es un objeto como:

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

Cualquier manera elegante de hacer esto apreciada.

Respuesta

12

Con true/false apoyo booleano:

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. Para el análisis del valor universal, puede usar el método JSON.parse con el bloque try/catch, tal como se presenta en Esailija's answer.

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

+0

Es posible que desee hacer que 'arr2 var = arr [i] .split (":", 1) 'que permitirá que los valores incluyan dos puntos. –

+0

Genial, pero también tendríamos que manejar "verdadero" y "falso": no queremos que aparezcan como cadenas en el JSON resultante, sino como booleanos. –

+0

@GarethMcCaughan Funcionará solo si tenemos valor en el lado derecho :) – 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); 

Resultado:

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

Solución inteligente. –

+0

La mejor solución. es un "mapa" de vergüenza que no se usa más en javascript. Ha sido compatible en todos los principales navegadores por un tiempo ahora – Dve

+0

¡Solución realmente inteligente! Sin embargo, falla si tiene una cadena o número como valor. Pero puede ser manejado fácilmente. – 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]}) 
} 

Tenga en cuenta que esto se transformará "falsa" y "verdadero" como cadena. Lo mismo para los números si lo tienes. Si desea guardarlos con los tipos adecuados, debe agregar una conversión manual. Algo así como:

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

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

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

    return val; 
} 

Por lo tanto la línea que empuje el objeto a la matriz va a cambiar de la siguiente manera:

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

Cuestiones relacionadas