2012-01-05 25 views
6

javascriptでは、フラットな配列をとり、配列の偶数インデックスメンバーをプロパティとして持ち、奇数インデックスメンバーを対応する値(ルビーのHash[*array]に類似)としてオブジェクトに変換する簡単な方法はありますか?例えばフラットアレイ[k1、v1、k2、v2]をJavaScriptのオブジェクト{k1:v1、k2:v2}に変換しますか?

、私はこれがある場合:

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

をそれから私はこれ欲しい:

{ 'a': 'b', 'c': 'd', 'e': 'f' } 

を私が思い付くした最高のは、これまでのところ、それがなければならないよりも、より冗長なようです。

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' } 

これを行うには、より優れた、あまり控えめな、またはよりエレガントな方法がありますか? (または最近ルビーでプログラミングしているだけですか?)

私は、vanilla javascriptで答えを探していますが、undercore.jsまたはjQueryを使用している場合は、これを行うより良い方法がある場合にも興味があります。パフォーマンスは本当に問題ではありません。

+4

をあなた自身の関数を作成することができ、それは非常に短いです: 'VAR OBJ =変換(ARR ); ';) –

+0

それは私にとってはむしろ簡潔に思えます。 – ChaosPandion

+0

あなたは正しいです。あなたが提供したループは正しい方法です。 –

答えて

8

これが機能して短くなってますかなり確信:

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

shift()を参照してください。

+0

しかし、速度についての保証はありません。 – paislee

+3

私はこれが好きです!しかし、これは元の配列を消費するという注意点として注意する必要があります。したがって、元の配列を気にしない場合にのみ機能します。 –

+0

@pst thx、あなたはそれに私を打ちました – 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をにメソッドを追加することができ、複数回必要な場合:

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' } 
関連する問題