1

有没有比这更简洁的方法将所有数组索引和值移动到一个对象:

arr = ["one","two","three"];
var rv = {};
for (var i = 0; i < arr.length; i++)
    rv[i] = arr[i];

我知道您可以遍历数组并一个一个地添加到一个新对象中,但是我讨厌在我想在两者之间切换时向我的代码添加一个循环,特别是在 SO 上提供答案时(请注意,这意味着制作一个功能已失效,因为这会使答案膨胀)。

PS:我不介意您的回答是否令人不悦或滥用语言功能,无论如何,JShackery 让我着迷。:)

4

3 回答 3

3

是否有一种简洁的方法将所有数组索引和值作为键值对移动到对象?

他们已经是。JavaScript 中的数组只是对象,具有以数组索引命名的属性。在经典的计算机科学意义上,它们根本不是真正的数组。

所以你很可能会发现你大部分时间都不需要这样做。(你的用例会很有趣。)但是当你这样做时,不,没有特别的捷径。无论你做什么,它都会成为一个循环,无论它是你代码中的一个循环,它是公开的,还是隐藏在下面的东西。您执行此操作的代码似乎与其他代码一样好。

于 2012-11-21T07:20:30.743 回答
2

这是一种骇人听闻的方式:

myArray.__proto__ = Object.prototype
于 2012-11-21T07:20:47.213 回答
1

如前所述,数组也是对象:typeof [] === 'object'

但无论如何,试试这个:

function objectify(arr) {
    return arr.reduce({}, function (p, e, i) {
        p[i] = e;
        return p;
    });
}

It's not really cleaner than yours, but it avoids declaring i. For a faster function, move the anonymous function outside of objectify so it doesn't get recreated every time.

于 2012-11-21T07:29:49.890 回答