将2个元素数组的JavaScript数组转换为对象键值对
从以下内容中获取信息的最快算法是什么:将2个元素数组的JavaScript数组转换为对象键值对,javascript,arrays,object,Javascript,Arrays,Object,从以下内容中获取信息的最快算法是什么: var array = [ [1,'a'], [2,'b'], [3,'c'] ]; Object { 1: "a", 2: "b", 3: "c" } 对这样的事情: var array = [ [1,'a'], [2,'b'], [3,'c'] ]; Object { 1: "a", 2: "b", 3: "c" } 到目前为止,我的想法是: function objectify(array) { var object = {};
var array = [ [1,'a'], [2,'b'], [3,'c'] ];
Object { 1: "a", 2: "b", 3: "c" }
对这样的事情:
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;
}
这很好,但似乎有点笨拙。有更好的办法吗?你想做点什么吗?那会更快吗?你确实可以使用:
其中p
是上一次迭代的结果,最初{}
,而c
是数组的当前元素
它不太可能比array.forEach快,但它更干净。我认为没有比这更简单的实现了
注意:库中已经存在一个函数来完成这项工作:
\uu.object(array)
您可以像这样将整个内容包装在其中
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
对象,我们将其作为实际结果返回。Lodash有一个\uFromPairs
方法可以准确地做到这一点
从文档中:
_.fromPairs([[a',1],[b',2]]);
//=>{a:1,'b:2}
使用现代语法的简洁版本:
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), {});
}
使用,您可以从数组
转换为对象
:
var数组=[
[1,‘a’],
[2,‘b’],
[3,'c']
];
var object=object.fromEntries(数组);
console.log(对象)代码>这非常适合我的用例。我认为自己在ESXXXX相当精通,但我不太清楚拉姆达是如何运作的。特别是(o[k]=v,o)
部分。有什么见解吗?另外,感谢您分享此宝石。:-)@KyleFarris它使用逗号运算符对映射执行赋值,然后返回o
本身。这是“正确”的答案,比reduce
方法好得多。如果您需要针对非常旧的浏览器(如IE),请仅使用reduce
,这是一种非常优雅的方式。这个代码片段完成了这项工作,没有任何进一步的复杂性。