2012-05-18 28 views
12

Şimdi bunu yapmaya çalışıyorum ve bir ilişkilendirici diziyi (değerleri) bir karakterle sınırlanan bir dizeye dahil etmek için "en çok kullanılan" yöntem olup olmadığını merak ediyorum.İlişkisel diziyi bir dizeye ekleme

var AssocArray = { id:0, status:false, text:'apple' }; 

dize biz "" karakteri Herhangi fikirle onlara katılmak eğer

"0, false, 'apple'" or "0, 0, 'apple'" 

olacak bu nesnenin elemanlarını birleştirmek sonucu Örneğin, ben var? Teşekkürler!

+1

Bunu yapmak için yerleşik bir yöntem yoktur; sadece kısa bir kod parçası yaz. Bir 'in' in 'döngüsü tarafından döndürülen özelliklerin sıralanmasının tahmin edilemeyeceğini unutmayın, bu yüzden değerleri sipariş etmek için kanonik bir şekilde empoze etmek istiyorsanız, kendiniz bir şey düşünmeniz gerekir. – Pointy

cevap

9

Sadece dizi boyunca ilerleyin.

var AssocArray = { id:0, status:false, text:'apple' }; 
    var s = ""; 
    for (var i in AssocArray) { 
     s += AssocArray[i] + ", "; 
    } 
    document.write(s.substring(0, s.length-2)); 

Will çıkışı:: böyle devam 0, false, apple

+1

'AssocArray'da' 'AssocArray'da var' olmalıdır, böylece global ad alanını kirletmez. – pseudosavant

+0

Çok doğru, bu örnekte dikkate almadığım bir şey. – Hidde

+0

Belki de 'hasOwnProperty' kullanarak şu şekilde kontrol eklemelisiniz: '(AssocArray'da var) { ** (AssocArray hasOwnProperty (i)) ** s + = AssocArray [i] +", "; } ' Bakınız: http://stackoverflow.com/questions/921789/how-to-loop-through-plain-javascript-object-with-objects-as-members –

17
Object.keys(AssocArray).map(function(x){return AssocArray[x];}).join(','); 

PS: orada Object.values yöntem yerde, ancak standart bir değil. Ayrıca hashish gibi harici kütüphaneler de var.

+2

Tek gömlekleri çok seviyorum ama iki şeyi göz önünde bulundurmanız gerekiyor: IE <9 için çalışmıyor ve 'map' işlevini kullanmak çok büyük nesneler için yavaş olabilir. – MaxArt

+1

1) uyumluluk kütüphaneleri ile IE <9 için çalışır; 2) dize birleştirme çok yavaş ... Yani gerçekten büyük nesneler için node.js içinde akışlar gibi tamamen başka bir yaklaşım kullanmak zorundasınız (ama gerçekten, bu soruda değil) – alex

+1

ali başka kütüphaneleri kullanma hakkında hiçbir şey söylemedim, ama yine de işlevlerini çağırmak, dizge bitiştirme işleminden çok daha yavaştır ve dizeleri birleştirmek istemeseniz bile, her zaman geçici diziler kullanabilir ve sonunda 'join' özelliğini kullanabilirsiniz. – MaxArt

5

Object.map, Object.forEach gibi fonksiyonların uygulanması ve hala tartışılıyor JavaScript'teki Herhangi dizi indeksleri, hatta ilişkisel diziler vardır. Şimdilik, böyle bir şey sopa ile:

function objectJoin(obj, sep) { 
    var arr = [], p, i = 0; 
    for (p in obj) 
     arr[i++] = obj[p]; 
    return arr.join(sep); 
} 

Edit: Geçici dizi kullanarak ve performans iyileştirme için dize birleştirme yerine bu katılmadan.

Düzenleme 2: arr.push(obj[p]); yerine sayıcı aslında son tarayıcıların çoğundahızlı olabilir gibi görünüyor. Yorumlara bakınız.

+0

sadece kullanmadığınız bir neden var mı arr.push (obj [p]) yerine 'arr [i ++] = obj [p]'? – pseudosavant

+0

Çünkü "push" çok hızlı bir işlev olsa bile, yine de bir işlevdir ve bir işlevi çağırmak zaman açısından pahalıdır.Günümüzde pek çok tarayıcı özel optimizasyona sahiptir, ancak bu her zaman böyle değildir. Başka bir teknik, dizinin yeniden boyutlandırılmasını önlemek için elemanlarını 'Yeni Array (lentgh)' ile atamadan önce dizilendirmekten ibarettir, ancak sadece 'uzunluk' biliniyorsa ve bu durum böyle değilse yapılabilir. – MaxArt

+1

Bir erken optimizasyon gibi görünüyor. Bu iki yöntem arasında performansa benzeyen çok şey değişiyor ve 'en iyi' şekilde kullanılan tarayıcıya bağlı. Bu jsperf örneğine göz atın: http://jsperf.com/array-increment-vs-array-push – pseudosavant