-1

Web サイトの特定のメニューの基礎となるオブジェクトの配列があります。JavaScript を使用してビルドされます。

[
  {"menuName":"Contact Info","sectionName":"contacts"},
  {"menuName":"Facilities","sectionName":"facilities"},
  {"menuName":"Locations","sectionName":"locations"},
  {"menuName":"Packages","sectionName":"packages"},
  {"menuName":"Policies","sectionName":"policies"},
  {"menuName":"Reviews","sectionName":"reviews"},
  {"menuName":"Rooms","sectionName":"rooms"}
]

そこで、インデックスと長さを処理する必要がないように、「for in ループ」を使用することにしました。メニューがビルドされると、メニューに 7 つの項目が表示されることを期待しています ( と を使用<ul>します<li>)。

デバッグ中に誤って に背景色を追加してしまった<li>とき、すべての地獄が解き放たれました。<li>7 番目のメニューが表示された後、少なくとも 30 個が空であることがわかりました<li>

なぜこうなった?

編集:

これがループです。ループは、後で解析する別の関数の別のオブジェクトを作成します。(前の配列によって提供されるプロパティを持つ<li>with を作成します。) この "for-in" ループを通常の for ループまたは while ループに変更すると、正常に動作するため、他の関数が正常に動作することがわかっています。<a>

this.sectionList = function(menu, id) {
    var list = new Array();

    for(var i in menu) {
        var listItem = {
            "element" : "li",
            "contains" : [{
                "element" : "a",
                "attr" : {
                    "href" : menu[i].sectionName + ':' + id
                },
                "contains" : menu[i].menuName
            }]
        }
        list.push(listItem);
    }
}
4

3 に答える 3

11

for inオブジェクトのプロパティを反復処理します。Javascript 配列は、単なる配列として扱うのに役立ついくつかの便利なプロパティを備えた特定の種類のオブジェクトですが、内部オブジェクト プロパティがまだあります..これらを反復処理するつもりはありません)。

したがって、 を使用for inして配列を反復処理するべきではありません。これは、背景色を追加したときにのみ明らかになりましたが、常にそうです。

代わりに、 counter と array でループします.length

于 2011-08-07T17:56:53.773 に答える
2

オブジェクトは、JavaScript 自体によって渡されるメソッドとプロパティを取得します。これらは、すべてのオブジェクトが作成時に取得するメソッドです。

.hasOwnPropertyオブジェクトに割り当てたプロパティとメソッドだけを見つけるために使用する必要があります!

for(var i in myObject){
  if(myObject.hasOwnProperty(i)){
    console.log(myObject.i);
  }
}

それが役立つことを願っています!

これは、私がそれをよりよく理解するのに役立つ2つの記事です。

http://bonsaiden.github.com/JavaScript-Garden/#object.hasownproperty http://javascriptweblog.wordpress.com/2011/01/04/exploring-javascript-for-in-loops/

于 2011-08-07T17:51:47.113 に答える
1

この jsFiddle: http://jsfiddle.net/jfriend00/HqLdk/でデータ構造を反復する 2 つの方法に違いはありません。

配列で使用してはいけない理由はたくさんあります。for (x in array)主な理由は、そのタイプの反復が、配列要素だけでなく、オブジェクトのプロパティを反復することです。これらのプロパティには、配列の他のプロパティが追加されている場合、追加されたfor (var i = 0; i < array.length; i++)プロパティをメソッドに含めることができます。定義により、配列要素のみを反復処理するため、追加されたプロパティでメソッドに問題が発生することはありません。

配列オブジェクトに追加のプロパティが追加されていない場合、プロパティを繰り返し処理するとたまたま配列要素だけが含まれることは、多少の幸運です。言語は、配列要素をそのように反復することを望んでいません。配列を反復する必要があります

for (var i = 0; i < array.length; i++).

より単純な構文の魅力は理解していますが、それは正しい方法ではありません。

于 2011-08-07T17:49:04.747 に答える