JavaScript对象结构:如何使用';complex.key';

JavaScript对象结构:如何使用';complex.key';,javascript,Javascript,给定这样一个对象: var obj = { "name":"JonDoe", "gender":"1", "address":{ "phone":"1" } } 我知道你可以拥有这样的东西: console.log(obj['name']); // returns 'JonDoe' 我的问题来自内部结构“address”,我想用它的“phone”内部字段来定位obj['address.phone'],但它返回的是未定义的,所有级别1字段都返回匹配值 我很确定你可以用一

给定这样一个对象:

var obj = {
"name":"JonDoe",
"gender":"1",
"address":{
    "phone":"1"
    }
}
我知道你可以拥有这样的东西:

    console.log(obj['name']); // returns 'JonDoe'
我的问题来自内部结构“address”,我想用它的“phone”内部字段来定位obj['address.phone'],但它返回的是未定义的,所有级别1字段都返回匹配值

我很确定你可以用一些(反)序列化函数或任何json库来完成,但我想知道是否有一种聪明的方法来列出所有内部结构,比如“地址”,而不知道我要针对哪个字段(比如obj[field])。

做:

var phone = obj.address.phone;
使用变量作为属性名时,通常使用括号表示法。如果您知道这些属性,请随意使用点符号(如上所示)

您可以尝试以下方法:

var addresses = [];

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        addresses.push(obj[key]['address']);
    }
}

console.log(addresses);
对于更复杂的对象属性查询,请使用此库

更新 如果要列出所有地址电话,无论它们有多深,请尝试递归扫描:

var phones = [];

var scan = function(obj) {
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            if (key == 'address') {
                phones.push(obj[key]['phone']);
            }
            else if (typeof obj[key] === 'object') {
                scan(obj[key]);
            }
        }
    }
};

scan(obj)
console.log(phones);

试过了
obj[“地址”][“电话”]
?我完全同意该解决方案的总体目的。。。但不是我的。我的缺点是:我没有把足够的注意力放在这件重要的事情上:*对我将要瞄准的领域没有初步的了解**。这意味着我事先不知道我的领域是什么:要么是一级领域,要么是更深层次的复杂领域;不幸的是,除非我读错了,否则我只能说我可以使用直接寻址,而不能:如果field='address.phone'(例如),obj.hasOwnProperty(字段)将返回false,只允许我跳过它。我也研究了“in”方法,但我认为问题是一样的。如果我是,请纠正我wrong@Marvin,我已经更新了我的答案。如果它不是你想要的,请告诉我。它更接近,但在这里,结构可能非常复杂,有许多嵌入式结构和内部层次。因此,我将不得不测试其中的许多内容,在这种情况下,对于我看来相当基本的东西来说,这将是一个相当繁重的过程。但从你的代码来看,我想我可以做stg,因为我应该能够在这里对赋值的两边使用递归性。。。我必须考虑一下。这是一个有趣的轨道,我将遵循。我会告诉你我是否能做到,以及如何做到