Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Convert flat array [k1,v1,k2,v2] to object {k1:v1,k2:v2} in JavaScript?

Is there a simple way in javascript to take a flat array and convert into an object with the even-indexed members of the array as properties and odd-indexed members as corresponding values (analgous to ruby's Hash[*array])?

For example, if I have this:

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

Then I want this:

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

The best I've come up with so far seems more verbose than it has to be:

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

Is there a better, less verbose, or more elegant way to do this? (Or I have just been programming in ruby too much lately?)

I'm looking for an answer in vanilla javascript, but would also be interested if there is a better way to do this if using undercore.js or jQuery. Performance is not really a concern.

like image 583
Ben Lee Avatar asked Jan 05 '12 22:01

Ben Lee


2 Answers

Pretty sure this will work and is shorter:

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

See shift().

like image 115
calebds Avatar answered Nov 11 '22 01:11

calebds


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;

}, { } );
like image 41
goofballLogic Avatar answered Nov 10 '22 23:11

goofballLogic