1

これよりも、すべての配列インデックスと値をオブジェクトに移動するより簡潔な方法はありますか?

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

配列を反復処理して新しいオブジェクトを 1 つずつ追加できることはわかっていますが、特に SO でここで回答を提供するときに、2 つを切り替えたいときはいつでもコードにループを追加するのは嫌いです (これは、これは答えを肥大化させるためです)。

PS: あなたの答えが嫌われているか、言語機能の誤用であるかは気にしません。いずれにせよ、JS ハッカーは私を魅了します。:)

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;
    });
}

あなたのものよりもきれいではありませんが、宣言を避けiます。関数を高速化するには、匿名関数を objectify の外に移動して、毎回再作成されないようにします。

于 2012-11-21T07:29:49.890 に答える