【问题标题】:Why this code print 20 undefined? [closed]为什么这段代码打印 20 undefined? [关闭]
【发布时间】:2012-10-30 14:26:21
【问题描述】:

Code

var coordinateTratte = {
        "1522-nord": [
             {"Distanza": 0, "Lat": 45.02915, "Lng": 7.606131667},            
             {"Distanza": 0.1, "Lat": 45.02805167, "Lng": 7.605818333}
        ]
    };

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var prop in obj) {  
        console.log(obj[prop].Lat);
    }
}
​

为什么 20 未定义?

【问题讨论】:

  • 是的,工作:jsfiddle.net/8ejhR/1
  • 您已经加载了 MooTools,并且正如其他人所显示的那样,您没有正确地迭代数组。使用jsFiddle时,最好先在左侧设置好合适的设置,比如从菜单中选择No-Library (pure JS)
  • 这是一个愚蠢的问题吗? -3?大声笑...

标签: javascript object return iteration undefined


【解决方案1】:

"1522-nord" 是一个数组,您使用 for-in 遍历该数组。不要在数组上使用 for-in。使用常规循环:

for (var key in coordinateTratte) {
    var obj = coordinateTratte[key];
    for (var i = 0; i < obj.length; i++) { // <--
        console.log(obj[i].Lat);
    }
}

【讨论】:

    【解决方案2】:
    var coordinateTratte = {"1522-nord":[{"Distanza":0,"Lat":45.02915,"Lng":7.606131667},{"Distanza":0.1,"Lat":45.02805167,"Lng":7.605818333}]};
    
    for (var key in coordinateTratte) {
        var obj = coordinateTratte[key];
        for (var i = 0; i < obj.length; i++) {  
            console.log(obj[i].Lat);
        }
    }
    

    小提琴:http://jsfiddle.net/bdgnJ/

    【讨论】:

      【解决方案3】:

      @user1689607 的评论在我看来就是答案。当您选择 no lib (pure JS) 时,您的代码不会记录任何 undefined 值。问题是:库经常摆弄本机类型的原型。这样做最臭名昭著的库是prototype.js(线索就在名称中)。例如,常规、未更改的 Array 对象的 “神奇属性” 是不可枚举的(即:不会出现在数组的 for...in 循环中)。但是,当您开始添加自己的属性和方法时,它们可能 会出现。由于Array 是从Object 原型派生的,因此对该原型的任何更改也可能会出现。

      它的长短是:从不ever在数组上使用for...in。如果您确实使用for...in(在对象上),请始终检查您正在处理的任何属性是否直接设置在该对象上,并且不是来自原型:

      for (var prop in someObject)
      {
          if (someObject.hasOwnProperty(prop))
          {
              //do stuff
          }
      }
      

      就数组而言:for(var i=0;i&lt;theArray.length;i++) 应该可以帮助您避开大多数问题(请记住,数组在 JS 中是稀疏的):

      var normalArray = [1,2];
      var sparseArray = [1,2,3,4];
      delete sparseArray[2];//will log [1,2,undefined,4]
      for (var i=0;i<sparseArray.length;i++)
      {
          if (i < normalArray.length)
          {
              console.log(normalArray[i]);
          }
          console.log(sparseArray[i]);//will log 1 - 2 - undefined - 4
          if (sparseArray.hasOwnProperty(i))
          {
              console.log(sparseArray[i]);//logs 1 - 2 - 4
          }
      }
      

      【讨论】:

        【解决方案4】:

        试试:

        for (var key in coordinateTratte) {
            var obj = coordinateTratte[key];
            for (var prop in obj) {  
                if(obj.hasOwnProperty(prop))
                    console.log(obj[prop].Lat);
            }
        }
        

        您遍历所有 Array 属性。即使它们来自其原型。

        【讨论】:

        • +1 :-] 此外,您可以使用chris.photobooks.com/json/default.htm 来清楚地了解您的结构,并查看何时应该循环槽对象和数组。
        • -1 不要在数组上使用 for in,即使它有效。
        • 顺便说一句。对于数组,最好使用简单的 for 循环或 forEach 方法(如果您的代码不必在旧 IE 上运行 - check browser compatibility)。
        • @David :“不要在数组上使用 for in,即使它有效。”为什么?只是好奇...
        • @markzzz 比较冗长,不可读,需要使用.hasOwnProperty方法。此外,如果初学者看到这一点,他们可能会在自己的程序中错误地模仿它。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-18
        • 2018-08-19
        • 2022-01-10
        • 1970-01-01
        相关资源
        最近更新 更多