2012-05-24 202 views
7

我有以下字符串字符串转换为JavaScript对象

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

我想转换是一个对象,如:

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

任何优雅的方式做此表示赞赏。

回答

12

随着true/false布尔支持:

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/


更新。对于通用值解析,您可以使用JSON.parse方法和try/catch块,如Esailija's answer中所示。

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

+0

您可能要作出这样的'变种ARR2 = ARR [i] .split(“:”,1)'这将允许值包含冒号。 –

+0

太好了,但我们也必须处理“真”和“假”:我们不希望它们在结果JSON中作为字符串出现,而是作为布尔值。 –

+0

@GarethMcCaughan只有当我们对右侧有价值时,它才会起作用:) – 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); 

结果:

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

聪明的解决方案。 –

+0

最佳解决方案。它的一个耻辱'地图'在JavaScript中并没有被更多地使用。它在所有主流浏览器中得到了一段时间的支持 – Dve

+0

真的聪明的解决方案!但是,如果您有任何字符串或数字作为值,则会失败。但它可以很容易地处理。 – 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]}) 
} 

注意,这将设置 “假” 与 “真” 的字符串。如果有的话,数字也是一样。如果你想保存适当的类型,你必须添加一个手动转换。喜欢的东西:

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

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

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

    return val; 
} 

因此该推对象到阵列的行会如下改变:

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