2012-01-05 10 views
6

Düz bir dizi almak ve karşılık gelen değerler (Ruby'nin Hash[*array] için analgous) olarak tekdüze endeksli üyeleri olarak dizinin çift dizinli üyeleri ile bir nesneye dönüştürmek için javascript basit bir yolu var mı? Bunu alabilir ÖrneğinDüz diziyi [k1, v1, k2, v2] nesnesine {k1: v1, k2: v2} nesnelerine dönüştürün.

:

şimdiye kadar ile geldim iyi olması gerekenden daha ayrıntılı görünüyor
{ 'a': 'b', 'c': 'd', 'e': 'f' } 

: Sonra

[ 'a', 'b', 'c', 'd', 'e', 'f' ] 

Şunu istiyorum:

var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = {}; 
for (var i = 0, len = arr.length; i < len; i += 2) { 
    obj[arr[i]] = arr[i + 1]; 
} 
// obj => { 'a': 'b', 'c': 'd', 'e': 'f' } 

Bunu yapmak için daha iyi, daha az ayrıntılı veya daha zarif bir yol var mı? (Ya da sadece son zamanlarda yakutta programlama yaptık mı?)

Vanilla javascript'te bir cevap arıyorum, ancak undercore.js veya jQuery kullanıyorsa bunu yapmanın daha iyi bir yolu varsa da ilgilenirim. Performans gerçekten bir endişe değil.

+4

Kendi fonksiyonunu oluşturabilir ve ardından oldukça kısadır: 'var obj = dönüşümü (arr); ';) –

+0

Bu benim için biraz özlü görünüyor. – ChaosPandion

+0

Doğru var. Sağladığınız döngü, bunu yapmak için doğru yoldur. –

cevap

8

bu işe ve kısadır olacaktır eminim:

var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = {}; 
while (arr.length) { 
    obj[arr.shift()] = arr.shift(); 
} 

shift() bakınız. Eğer siz de Array.prototype için bir yöntem ekleyebilirsiniz birden çok kez onu gerekiyorsa

+0

Ancak hız hakkında herhangi bir garanti yok. – paislee

+3

Bunu beğendim! Ancak, muhtemelen bu orijinal diziyi tüketen bir uyarı olarak dikkat etmelisiniz, bu yüzden sadece orijinali önemsemiyorsanız işe yarar. –

+0

@pst thx, onu bana dövdün – paislee

4
var arr = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 
var obj = arr.reduce(function(ret, value, i, values) { 

    if(i % 2 === 0) ret[ value ] = values[ i + 1 ]; 
    return ret; 

}, { }); 
0

:

Array.prototype.to_object = function() { 
    var obj = {}; 
    for(var i = 0; i < this.length; i += 2) { 
    obj[this[i]] = this[i + 1]; 
    } 
    return obj 
}; 

var a = [ 'a', 'b', 'c', 'd', 'e', 'f' ]; 

a.to_object(); // => { 'a': 'b', 'c': 'd', 'e': 'f' } 
İlgili konular