在for循环中访问嵌套Javascript文字的属性

时间:2016-01-06 12:04:35

标签: javascript

我已经得到了我认为是一个相当简单的JavaScript问题,但它令我感到困惑。基本上,我无法在for循环中访问嵌套对象文字的属性内部属性。如果有人向我解释为什么这不起作用,我会很高兴:

var object = {

        "foo":{
            propertyOne : "One",
            propertyTwo : "Two"
            },
        "bar":{
            propertyOne : "Three",
            propertyTwo : "Four"
        }

    };

    //This correctly returns "One"
    window.alert(object.foo.propertyOne);

    for(var m in object)
    {
        //this returns foo followed by bar
        window.alert(m);
        //This returns undefined
        window.alert(m.propertyOne);
    }

我认为这足以说明问题。当我尝试访问循环中内部对象的属性时,为什么会出现未定义?我想我在这里错过了一些非常简单的东西。

感谢阅读。

3 个答案:

答案 0 :(得分:3)

这是因为for循环中的m是一个键名(一个字符串)。您可以使用它来访问该键引用的实际值:

for(var m in object)
{
        // This returns 'foo' followed by 'bar'
        console.log(m);

        // returns 'string'
        console.log(typeof m);

        // This returns the value referenced under the 'm' key
        console.log(object[m]);

        // Since we know the value is an object with a `propertyOne` key..

        // This returns a value from the object which is referenced by the 'm' key
        console.log(object[m].propertyOne);
}

答案 1 :(得分:0)

应该是

for(var m in object)
{
    window.alert(m);
    window.alert(object[m].propertyOne); 
}

m是它没有属性的关键名称,您需要使用此密钥名称从object获取值,然后读取该值的属性{ {1}}。

答案 2 :(得分:0)

for..in循环遍历对象的属性名称。请参阅MDN - for..in

上的文档

MDN article on Objects,属性名称可以定义为:

  

...任何有效的JavaScript字符串,或任何可以转换为字符串的内容,包括空字符串。

因为属性名称是字符串,所以它没有您在对象中定义的任何属性。但是,您可以使用属性名称以这种方式访问​​属性:

for(var m in object) {
  window.alert(m);
  window.alert(object[m].propertyOne); 
}