是否有更简洁的方法将所有数组索引和值移动到对象上,而不是:
arr = ["one","two","three"];
var rv = {};
for (var i = 0; i < arr.length; i++)
rv[i] = arr[i];
我知道你可以迭代数组并逐个添加到一个新对象,但是我讨厌每当我想在两者之间切换时都会为我的代码添加一个循环,特别是在提供答案时在这里SO(请注意,这意味着制作一个功能,因为这会使答案膨胀得那么多)。
PS:我不介意你的回答是不赞成的还是滥用语言功能,JS hackery无论如何都让我着迷。 :)答案 0 :(得分:3)
是否有一种将所有数组索引和值作为键值对移动到对象的简洁方法?
他们已经。 JavaScript中的数组只是对象,具有为数组索引命名的属性。他们aren't really arrays at all在经典的计算机科学意义上。
所以你可能会发现大部分时间都不需要这样做。 (你的用例很有意思。)但是,当你这样做时,不,没有特别的捷径。无论你做什么,它都会成为一个循环,无论它是在你的代码中是一个循环,还是隐藏在下面的东西。你做这件事的代码似乎和其他代码一样好。
答案 1 :(得分:2)
这是一种愚蠢的方式:
myArray.__proto__ = Object.prototype
答案 2 :(得分:1)
如上所述,数组也是对象:typeof [] === 'object'
但无论如何,试试这个:
function objectify(arr) {
return arr.reduce({}, function (p, e, i) {
p[i] = e;
return p;
});
}
它并不比你的更清洁,但它避免声明i
。要获得更快的功能,请将匿名函数移到objectify之外,这样每次都不会重新创建它。