私はJavaScriptでのオブジェクトを持っている:
var object = someobject;
Object { aaa=true, bbb=true, ccc=true }
は、どのように私はこのためにそれぞれ使用することができますか?
object.each(function(index, value)) {
console.log(value);
}
動作しません。
私はJavaScriptでのオブジェクトを持っている:
var object = someobject;
Object { aaa=true, bbb=true, ccc=true }
は、どのように私はこのためにそれぞれ使用することができますか?
object.each(function(index, value)) {
console.log(value);
}
動作しません。
javascriptオブジェクトには標準の.each関数がありません。 jQueryは関数を提供します。 http://api.jquery.com/jQuery.each/以下
$.each(object, function(index, value) {
console.log(value);
});
別のオプションは、Object.keys()
を使用してバニラJavascriptを使用することです。このような配列.map()
機能
Object.keys(object).map(function(objectKey, index) {
var value = object[objectKey];
console.log(value);
});
がhttps://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keysとhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
これらは通常優れている参照してください動作するはず参照してください。バニラのJavascript for-loopを使用するよりも、通常のfor-loopを使用することの意味を理解していなければプロパティチェーンをループするような特性
通常、for-loopはjQuery
またはObject.keys().map()
よりうまく機能しません。下のプレーンなfor-loopを使用することで、2つの潜在的な問題に取り掛かります。
右、そうも他の回答で指摘し、プレーンなJavascriptの選択肢は以下のようになり
for(var index in object) {
var attr = object[index];
}
この2つの潜在的な問題があります。
1。見つかった属性がオブジェクト自体から来たものであり、プロトタイプチェーンからのものではないかどうかをチェックしたいとします。これには、
for(var index in object) {
if (object.hasOwnProperty(index)) {
var attr = object[index];
}
}
は、より多くの情報のためhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnPropertyを参照してくださいのようなhasOwnProperty
機能で確認することができます。
jQuery.each
とObject.keys
の機能がこれを自動的に処理します。
2。プレーンなforループのもう1つの潜在的な問題は、スコープと非クロージャの問題です。これは少し複雑ですが、例えば次のコードを取ってください。私たちは、IDSのbutton0、ボタン1、ボタン2などとボタンの束を持っている、と我々はこのようなconsole.log
それらのonclickのを設定してやりたい:
<button id='button0'>click</button>
<button id='button1'>click</button>
<button id='button2'>click</button>
var messagesByButtonId = {"button0" : "clicked first!", "button1" : "clicked middle!", "button2" : "clicked last!"];
for(var buttonId in messagesByButtonId) {
if (messagesByButtonId.hasOwnProperty(buttonId)) {
$('#'+buttonId).click(function() {
var message = messagesByButtonId[buttonId];
console.log(message);
});
}
}
場合は、いくつかの時間の後、我々はボタンのいずれかをクリックします私たちはいつも "最後にクリックされた"ようになるでしょう。コンソールで、そして決して "最初にクリックした!"または「クリックされた真中!どうして?onclick関数が実行される時点で、その時点でbuttonId
変数を使用するmessagesByButtonId[buttonId]
が表示されます。そしてそのループはその時点で終了しているので、buttonId
変数は "button2"(最後のループ反復中に持っていた値)のままなので、messagesByButtonId[buttonId]
はmessagesByButtonId["button2"]
、つまり「最後にクリックされました!」になります。
クロージャの詳細については、https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closuresを参照してください。特にこの例の最後の部分です。
ここでも、それはfunction(index, value)
を提供してくれますのでjQuery.each
とObject.keys().map()
は、私たちのために自動的にこの問題を解決する(つまり、閉鎖を持っている)ので、インデックスと値の両方を使用すると、彼らは我々が期待する価値を持っているので安心しても安全です。
for(var key in object) {
console.log(object[key]);
}
ありがとう、しかし、これはaaa、bbb、cccの代わりに私を"真 "返します: –
あなたがaaa、bbb、cccを見たいと思えば、 –
見つかったキーがオブジェクト自体から来たものか、プロトタイプチェーンからのものかを調べたいかもしれませんが、object.hasOwnProperty(key)を使って –
var object = { "a": 1, "b": 2};
$.each(object, function(key, value){
console.log(key + ": " + object[key]);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>
//output
a: 1
b: 2
これは間違っています! $。それぞれはJQuery-Frameworkです! – raiserle
これはjqueryに依存します。 jQueryなしのソリューションをお持ちですか? –
あなたは、それがjQueryに依存している – davidtaubmann
http://stackoverflow.com/questions/921789/how-to-loop-through-javascript-object-literal-with-objects-as-メンバー –
jQueryを使用していますか?あなたはどんな結果を期待していますか?コンソールで3つの「真」ですか? – davids
$ .each(http://api.jquery.com/jQuery.each/)のjQueryのドキュメントは完璧な例です。ページの2番目のコードブロックを参照してください。 console.log()の代わりにalert()を使用します。 – Faust