0

this.themeDataこのようなオブジェクトがあります(コンソール出力が表示されます)

Object
    Banner: Object
        property: "null"
        raw: "uploads/1/somefile.png"
        selector: "null"
        value: "../../uploads/1/somefile.png"
        __proto__: Object
    H1_FontSize: Object
    H2_FontColor: Object
    H2_FontSize: Object

そして、私はこのようにループします:

    for (attrName in this.themeData) {
        attrData = this.themeData[attrName];
        if (attrData.selector && attrData.value) {
            $(".SomeSelector").css(attrData.property, attrData.value);
        }
    }

これは機能しますが、最近のSO の質問で、使用すべきではないことがわかりましたfor in。しかし、インデックスが存在しない数値for(var i = 0; i<arr.length; i++)でない場合、どうすればループスルーできthis.themeData[i]ますか?

4

2 に答える 2

2

オブジェクトでfor..inループを使用するのは問題ありません。必要なのは、hasOwnProperty()チェックでそれらをフィルタリングすることだけです。

for (attrName in this.themeData) {
    if (this.themeData.hasOwnProperty(attrName)) {
        attrData = this.themeData[attrName];
        if (attrData.selector && attrData.value) {
            $(".SomeSelector").css(attrData.property, attrData.value);
        }
    }
}
于 2012-08-31T10:50:41.103 に答える
2

私の意見では、メソッドの使用for...inは問題ありませんが、探しているプロパティがプロトタイプ チェーンのどこかからのものではないことを確認してください。

var foo = Object();
for(item in foo) {
  if(foo.hasOwnProperty(item) {
      alert(item); // The key
      alert(foo[item]); // The value.
  }
}

をチェックしないhasOwnPropertyと、 から継承されたプロパティになってしまいますObject

于 2012-08-31T10:51:57.367 に答える