将2个元素数组的JavaScript数组转换为对象键值对

Fre*_*est 13 javascript arrays object

从这样的东西获得最快的算法是什么:

var array = [ [1,'a'], [2,'b'], [3,'c'] ];
Run Code Online (Sandbox Code Playgroud)

这样的事情:

Object { 1: "a", 2: "b", 3: "c" }
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我提出的:

function objectify(array) {
    var object = {};
    array.forEach(function(element) {
        object[element[0]] = element[1];
    });
    return object;
}
Run Code Online (Sandbox Code Playgroud)

哪个工作正常,但似乎有点笨拙.有没有更好的办法?像reduce()这样的工作会更快吗?

Aln*_*tak 20

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

function objectify(array) {
    return array.reduce(function(p, c) {
         p[c[0]] = c[1];
         return p;
    }, {});
}
Run Code Online (Sandbox Code Playgroud)

p最初{},前一次迭代的结果在哪里,并且c是数组的当前元素.

它不可能比任何更快array.forEach,但它是恕我直言更清洁.我不相信有任何比这更简单的实现.

注意:在Underscore库中已经存在一个完全正确的函数:_.object(array)


Pen*_*Liu 19

使用Object.fromEntries,您可以从 转换ArrayObject

var array = [
  [1, 'a'],
  [2, 'b'],
  [3, 'c']
];
var object = Object.fromEntries(array);
console.log(object);
Run Code Online (Sandbox Code Playgroud)

  • 这是“正确”的答案,并且比“reduce”方法好得多。仅当您需要针对非常旧的浏览器(例如 IE)时才使用“reduce” (2认同)

Phr*_*ogz 7

使用现代语法的Terse版本:

let objectify = a => a.reduce( (o,[k,v]) => (o[k]=v,o), {} );
Run Code Online (Sandbox Code Playgroud)

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

// 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), {});
}
Run Code Online (Sandbox Code Playgroud)

  • 这适用于我的用例.我认为自己非常精通ESXXXX,但我无法弄清楚lambda是如何工作的.特别是`(o [k] = v,o)`部分.任何见解?另外,感谢分享这个宝石.:-) (2认同)
  • @KyleFarris它使用逗号运算符来执行到地图的赋值,然后返回"o"本身. (2认同)

Uri*_*lar 5

Lodash 有一个_.fromPairs方法可以做到这一点。

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