Prototypeを使用してJavaScriptでオブジェクトのすべてのプロパティを反復処理しますか?


89

Prototype JavaScriptフレームワークを使用してオブジェクトのすべてのプロパティを反復処理する方法はありますか?

これが状況です:次のようなJSONのAJAX応答を取得しています:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

変数へのjson応答を評価する場合responseresponse.barobjオブジェクトの各プロパティを反復処理して、どのインデックスがtrueでどのインデックスがfalseであるかを確認できます。

プロトタイプには両方がObject.keys()ありますObject.values()が、奇妙なことに単純なObject.each()機能はありません!Object.keys()とObject.values()の結果を取得して、もう1つを反復するときに相互参照することもできますが、これはハックなので、適切な方法があると確信しています。

回答:


42

まず、オブジェクトリテラルをプロトタイプハッシュに変換する必要があります

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

パーフェクト!これはまさに私が探していたものです。
OverloadUT

57
残念ながら、プロトタイプなしの単純なjavascriptオブジェクトを反復処理したいだけの同様の質問がクローズされたため、この回答を「重複」のためにクローズされた質問と同じであるかのように扱う必要があります。したがって、ユーザーにプロトタイプをロードするよう強制する恐ろしい例です。ユーザーはプロトタイプについて何も言わなかったため、不要なライブラリを強制的にロードすることは役に立ちません。(これを実際に重複しているものとして扱ってください)。重複の誤った主張のために他の質問が閉じられなかった場合、私は回答を反対票投票する必要はありません。

2
質問者はプロトタイプが欲しいと言っていませんでしたか(または質問は編集されましたか?)?とにかくそれはすべていいです
emurano

外部ライブラリをロードする必要はありません
Healkiss '13年

553

ここではプロトタイプは必要ありません。JavaScriptにはfor..inループがあります。だれもがいじっていないかどうかわからない場合は、同様にObject.prototype確認hasOwnProperty()してください。

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
不要なライブラリを読み込ませずに、実際に回答していただきありがとうございます。

8
これは厳密な答えではありません。質問では、プロトタイプを使用する必要があると述べています。選択の自由-はは...
Sven Larson、

1
この質問の元のタイトルには、わかりやすくするために追加したプロトタイプが記載されていました。この質問は、身体の一番最初の行で証明されているように、プロトタイプが使用されている環境について具体的に尋ねていました。
OverloadUT

1
Javascriptを書くほど、forループを書くのが嫌になります:)
トリプティク2011

13
残念ながら、これは「すべてのオブジェクトプロパティのJavaScriptを反復する方法」などの理由でグーグルの場合に1番となる質問なので、実際にここに来る多くの人がおそらくこの質問に対する答えを探しています。彼らが望む質問はこれです:stackoverflow.com/questions/921789/…、これは実際にはオブジェクトリテラルとは何の関係もありません。
Baxissimo 2011

0

キーを繰り返し処理し、角かっこを使用して値を取得する必要があります。

参照:JavaScriptオブジェクトのプロパティを列挙するにはどうすればよいですか?

編集:明らかに、これは質問を重複させます。


このメソッドは、プロトタイプのドキュメント:prototypejs.org/api/array
OverloadUT

1
また、私が得たものであるプロトタイプネイティブのソリューションを探していたので、これは重複しているとは思いません。もう1つの質問は、フレームワークの使用を望まない人には適切ですが、Prototypeを使用している場合は、このソリューションの方がはるかに安全です。
OverloadUT

1
@OverloadUT:十分に注意深く読みませんでした。プレーンオブジェクトではなく配列のプロパティを反復処理することはお勧めしません
Christoph
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.