首页 > 解决方案 > 如果我不知道深度是多少,如何在 Javascript 中动态处理嵌套对象?

问题描述

抱歉,我不知道如何正确表达这个问题,但基本上,我有这个嵌套对象nestedObj。我想动态处理这个对象,但对象的深度不固定。例如:

nestedObj = {  
    "property1":{
        "subProperty1": {  
            "data": "This is the data for property1 > subProperty1"
        }
    },

    "property2":{
        "subProperty1": {
            "anotherSubProperty1": {
                "data": "This is the data for property2 > subProperty1 > anotherSubProperty1"
            }
        },
        "subProperty2": {
            "anotherSubProperty1": {
                "data": "This is the data for property2 > subProperty2 > anotherSubProperty1"
            }
        }
    },

    "property3":{
        "subProperty1": {  
            "data": "This is the data for property3 > subProperty1"
        }
    }
}

现在我想在一个for of循环中处理这个对象,我的最终目标是获取data某些节点的值。现在,每个对象节点的值的路径都定义在另一个对象中:

dataPath = {
    "property1": "subProperty1.data",
    "property2": "subProperty2.anotherSubProperty1.data",
    "property3": "subProperty1.data",
}

然后我用这个for of循环来处理它们:

properties = ["property1", "property2", "property3"];
for(var property of properties) {
    path_to_data = dataPath[property].split(".");
    data = nestedObj[path_to_data[0]][path_to_data[1]];

    // Some other logic
}

显然,这只适用于“property1”和“property3”。我必须为具有超过 2 个内部节点的所有对象添加特殊处理。对于具有不同深度的大数据,手动添加这些特殊处理程序并不理想。所以我的问题是,在 Javascript 中,当我拥有某个节点的“路径”时,有什么方法可以让我动态处理嵌套对象。

标签: javascript

解决方案


您可以使用 aObject.keys来循环dataPath对象。然后你split的值和使用它一个for 循环并跟踪data.

let nestedObj = {
    "property1": {
        "subProperty1": {
            "data": "This is the data for property1 > subProperty1"
        }
    },

    "property2": {
        "subProperty1": {
            "anotherSubProperty1": {
                "data": "This is the data for property2 > subProperty1 > anotherSubProperty1"
            }
        },
        "subProperty2": {
            "anotherSubProperty1": {
                "data": "This is the data for property2 > subProperty2 > anotherSubProperty1"
            }
        }
    },

    "property3": {
        "subProperty1": {
            "data": "This is the data for property3 > subProperty1"
        }
    }
}

let dataPath = {
    "property1": "subProperty1.data",
    "property2": "subProperty2.anotherSubProperty1.data",
    "property3": "subProperty1.data",
}

let properties = ["property1", "property2", "property3"]
for (let property of properties) {
    let path = dataPath[property].split('.')
    let data = nestedObj[property]
    for (let i = 0; i < path.length; i++) {
        data = data[path[i]]
        if (i + 1 === path.length) {
            console.log(data)
        }
    }
}


推荐阅读