-1

我有一组对象,它们将成为我网站中某个菜单的基础。它将使用 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 循环”,这样我就不必处理索引和长度了。我希望在构建时菜单中会出现七个项目(我将使用<ul>and <li>)。

当我在调试时不小心为<li>. <li>在可见的第 7 个菜单之后,我发现至少有 30 个是空的<li>

为什么会这样?

编辑:

这是循环。该循环为稍后解析的另一个函数创建另一个对象。(它创建了一个<li>带有<a>前一个数组提供的属性的内部。)我知道另一个函数可以正常工作,因为当我将此“for-in”循环更改为普通的 for 循环或 while 循环时,它可以正常工作。

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

希望有帮助!

这里有两篇文章帮助我两个更好地理解它:

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/

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 回答