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

时间:2014-10-19 19:48:21

标签: javascript arrays object

从这样的事情中获得最快的算法是什么:

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 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:5)

使用现代语法的Terse版本:

SizeHintRole

我将此技术用作简洁查询字符串解析器的一部分:

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

答案 2 :(得分:4)

Lodash有一个_.fromPairs方法就是这么做的。

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

答案 3 :(得分: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对象,我们将其作为实际结果返回。 / p>

答案 4 :(得分:0)

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

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