2012-05-24 15 views

cevap

12

:

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/


GÜNCELLEME. Evrensel değer ayrıştırması için Esailija's answer'da gösterildiği gibi try/catch bloklu JSON.parse yöntemini kullanabilirsiniz.

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

+0

yapabilir isteyebileceği 'var ARR2 = arr [i] .split (":", 1) ', değerlerin iki nokta üst üste eklenmesine izin verir. –

+0

Harika, ama aynı zamanda "doğru" ve "yanlış" ı da ele almalıyız: Sonuç olarak ortaya çıkan JSON'da diziler olarak değil, boole olarak dönmelerini istemiyoruz. –

+0

@GarethMcCaughan Sadece sağ tarafta değerimiz varsa çalışacaktır :) – 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); 

Sonuç: Bu dize olarak "yanlış" ve "gerçek" set olacağını

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

Akıllı çözüm. –

+0

En iyi çözüm. Onun bir utanç 'harita' javascript daha fazla kullanılmaz. Bir süredir tüm önemli tarayıcılarda destek oldu. – Dve

+0

Gerçekten akıllıca bir çözüm! Bununla birlikte, değer olarak herhangi bir dize veya sayıya sahipseniz başarısız olur. Ama kolayca idare edilebilir. – 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]}) 
} 

dikkat edin. Varsa numaralar için de aynı. Bunları uygun türlerle kaydetmek istiyorsanız, manuel bir dönüşüm eklemeniz gerekir. Bir şey gibi:

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

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

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

    return val; 
} 

nedenle diziye nesneyi itmek çizgi olarak aşağıda değişecektir:

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

İlgili konular