从这样的事情中获得最快的算法是什么:
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()之类的东西会工作吗会更快吗?
答案 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);