2014-10-19 53 views
8

什么是最快的算法从东西得到这样的:转换2个元件阵列的JavaScript数组转换成目标键值对

var array = [ [1,'a'], [2,'b'], [3,'c'] ]; 

到这样的事情:

Object { 1: "a", 2: "b", 3: "c" } 

到目前为止,这是我想出了什么:

function objectify(array) { 
    var object = {}; 
    array.forEach(function(element) { 
     object[element[0]] = element[1]; 
    }); 
    return object; 
} 

它工作正常,但它似乎有点笨拙。有没有更好的办法?会像reduce()工作,并会更快?

回答

9

你确实可以使用Array.prototype.reduce

function objectify(array) { 
    return array.reduce(function(p, c) { 
     p[c[0]] = c[1]; 
     return p; 
    }, {}); 
} 

其中p是前一次迭代的结果,最初{}c是数组的当前元素。

它不可能比array.forEach更快,但它是恕我直言清洁。我不认为有比这更简单的实施。

注意:一个函数来做到的正是这种已经存在于Underscore库:_.object(array)

2

你可以用内Array.prototype.reduce整个事情,这样

function objectify(array) { 
    return array.reduce(function(result, currentArray) { 
     result[currentArray[0]] = currentArray[1]; 
     return result; 
    }, {}); 
} 

console.log(objectify([ [1, 'a'], [2, 'b'], [3, 'c'] ])); 
# { '1': 'a', '2': 'b', '3': 'c' } 

我们只是积累的键值在result对象中对,最后reduce的结果将是result对象,我们将其作为实际结果返回。

1

Lodash有一个_.fromPairs方法,正是这样做。

从文档:
_.fromPairs([['a', 1], ['b', 2]]); // => { 'a': 1, 'b': 2 }

1

简明版采用现代语法:

let objectify = a => a.reduce((o,[k,v]) => (o[k]=v,o), {}); 

我使用这种技术作为一个简短的查询字符串解析器的一部分:

// Converts "?foo=bar&j=1&go" into { foo:'bar', j:'1', go:true } 
function parseQueryString(qs) { 
    var q = decodeURIComponent; 
    return qs.replace(/^\?/,'').split('&').map(s => s.split('=')) 
      .reduce((o,[k,v]) => (o[q(k)] = v?q(v):true, o), {}); 
}