在JavaScript中将平面数组[k1,v1,k2,v2]转换为对象{k1:v1,k2:v2}?

Ben*_*Lee 6 javascript arrays hash

有没有一种简单的方法在javascript中采用一个平面数组并转换为一个对象,其中数组的偶数索引成员作为属性,而奇数索引成员作为相应的值(对ruby的分析Hash[*array])?

例如,如果我有这个:

[ 'a', 'b', 'c', 'd', 'e', 'f' ]
Run Code Online (Sandbox Code Playgroud)

然后我想要这个:

{ 'a': 'b', 'c': 'd', 'e': 'f' }
Run Code Online (Sandbox Code Playgroud)

到目前为止,我提出的最好的看起来似乎比以前更加冗长:

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' }
Run Code Online (Sandbox Code Playgroud)

这样做有更好,更简洁,更优雅的方式吗?(或者我最近在ruby中编程太多了?)

我正在寻找一个vanilla javascript的答案,但如果有更好的方法,如果使用undercore.js或者也会感兴趣jQuery.性能并不是真正的问题.

pai*_*lee 8

很确定这会起作用并且更短:

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

shift().

  • 我喜欢这个!但是你应该注意这是一个警告,这会消耗原始数组,所以它只有在你不关心原始数据时才有效. (3认同)
  • 你也可以这样做:`var obj = {},k,v; while(k = arr.shift(),v = arr.shift()){obj [k] = v;}`,它甚至可以使用奇数个元素(忽略最后一个元素). (2认同)

goo*_*gic 5

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;

}, { } );
Run Code Online (Sandbox Code Playgroud)