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

IT技术 javascript arrays object
2021-02-25 20:30:03

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

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()这样的东西会起作用吗,那会更快吗?

5个回答

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

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

这是“正确”的答案,比reduce方法好得多reduce当您需要针对非常旧的浏览器(例如 IE)时才使用
2021-04-27 20:30:03
多么优雅的完成事情的方式。这段代码片段完成了这项工作,没有任何进一步的复杂性。
2021-05-08 20:30:03

你确实可以使用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)

使用现代语法的简洁版本:

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), {});
}
这非常适合我的用例。我认为自己对 ESXXXX 非常精通,但我无法弄清楚 lambda 是如何工作的。具体的(o[k]=v,o)部分。任何见解?另外,感谢分享这个宝石。:-)
2021-04-22 20:30:03
@KyleFarris 它使用逗号运算符在地图中执行赋值,然后返回o自身。
2021-04-23 20:30:03

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

从文档:
_.fromPairs([['a', 1], ['b', 2]]); // => { 'a': 1, 'b': 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对象,我们将其作为实际结果返回。