javascript - 如果我不知道深度是多少,如何在 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 中,当我拥有某个节点的“路径”时,有什么方法可以让我动态处理嵌套对象。
解决方案
您可以使用 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)
}
}
}
推荐阅读
- javascript - Javascript 在正则表达式匹配后打印一些字符
- php - file_put_content 的 str_ireplace 不起作用
- excel - 带有“On Error GoTo error”的 VBA 函数总是出错
- java - 如果对象的一个实例不为空或不为空,如何将所有属性的值从一个对象实例复制到另一个实例
- sql - 分组中的选择性计数
- node.js - 如何只允许管理员访问 Nodejs `AdminBro` 中的管理页面
- javascript - 从外部渲染访问它时奇怪的 Reactjs 状态行为
- r - 使用列名向量替换 NA
- r - R 中的 $mix$a 和 $mix$b 是什么意思?
- c++ - 在 system() 执行时取消 CTRL+C [C++]