【问题标题】:Loop over javascript object IE8循环遍历javascript对象IE8
【发布时间】:2013-03-09 11:16:57
【问题描述】:

data 是一个 Json 数据数组 每个对象的结构是:

var data = [
{
    id: 0, 
    img: "image_src", 
    width: 107, 
    height: 80, 
    shadowBoxLink: "....",
    th: {
        width: 107,
        height: 70, 
        img: "src"
    }
},
{
    id: 1, 
    img: "image_src", 
    width: 107, 
    height: 80, 
    shadowBoxLink: "....",
    th: {
        width: 107,
        height: 80, 
        img: "src"
    }
}
];

当我尝试在循环中访问数组时(仅在 IE8、IE7 中发生):

for(var i in data) {
    var imgHeight = data[i].th.height;
}

我收到一条错误消息:“无法获取“高度”的属性,引用为空或未定义”

(我从法语翻译了消息:Impossible d'obtenir la propriété « height » d'une référence null ou non définie)

我做错了什么?

【问题讨论】:

  • 查看编辑以了解另一个可能的问题。

标签: javascript arrays internet-explorer object for-loop


【解决方案1】:

访问数组元素可以更符合语义:

for(var i = 0, n = data.length; i < n; i ++) {
    var imgHeight = data[i].th.height;
    ...
}

for..in 循环用于基于键的对象。

注意:您的对象中还缺少一个结束引号:

th: Object {
   width: 107,
   height: 80, 
   img: "src /* NEED A CLOSING " HERE */
}

【讨论】:

  • @RobW 问题中阐述的结构是数组中每个对象的结构(data);即,data 是一个对象数组。
  • Thx @Abody97,这句话我忘了放在这里,但它存在于原始代码中
  • 我尝试了你建议的循环,没有错误,但也没有显示任何内容,我正在尝试调试它,看看我在其他地方是否有问题
  • @vladimire 我认为这是其他地方的错误,因为错误消失了。
【解决方案2】:

您似乎正在寻找不存在的房产

做一个简单的测试:

for(var i in data) {
  if(data[i] && data[i].th && data[i].th.height){
    console.log('the property exists');
  }else{
    console.log("no, it doesn't")
  }      
}

【讨论】:

  • 我认为问题不在于对象本身,因为提问者说他​​只是在 IE 中得到错误。
  • 你的方法是正确的,但这里的问题是不同的。请查看@Abody97 的回答
  • 我试过你的方法,我得到'该属性存在',除了最后一个!就像数组中有一个空条目
  • 嗯,是的@Abody97 答案说明了一切。由于您使用的是for in,IE 不仅会迭代数组内容,还会迭代其他属性,当然它们没有th.height。所以使用for()循环
【解决方案3】:

有一个对象数组。

因此,使用 for 并获取所需对象的属性。

给定代码中存在语法错误。用引号关闭字符串。

示例代码在这里。

var data = [
    {
        id: 0, 
        img: "image_src1", 
        width: 107, 
        height: 80, 
        shadowBoxLink: "....",
        th: {
            width: 107,
            height: 70, 
            img: "src"
        }
    },
    {
        id: 1, 
        img: "image_src2", 
        width: 107, 
        height: 80, 
        shadowBoxLink: "....",
        th: {
            width: 107,
            height: 40, 
            img: "src"
        }
    }
];

for(var i=0; i<data.length; i++) {
    var imgHeight = data[i].th.height;
    alert(imgHeight);
}            

【讨论】:

  • 但我正在尝试访问 th 内的属性“height”?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2015-09-16
  • 1970-01-01
  • 2016-07-08
  • 2015-10-15
  • 2011-04-18
相关资源
最近更新 更多