2014-10-19 50 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), {}); 
}