我有一个带有许多嵌套元素的对象,像这样
var out = {
"parentOne":{
"subParentOne":{
"childOne":0,
"childTwo":0
},
"subParentTwo":{
"otherChildOne":0,
"otherChileTwo":0
}
},
"parentTwo":{
[...]
}
}
对象中共有269个不同的属性。
我有一个数组,其中包含我需要像这样检索的属性的“路径”:
var prop = ["parentOne.subParentOne.childOne", "parentOne.subParentTwo.otherChildTwo"]
因此此数组最多可以包含269个元素。
要访问子键的值,请使用以下代码:
for (let p in prop) {
var result = out
var keys = prop[p].split(".")
for (let k in keys) {
result = result[keys[k]]
}
// do stuff with the value
}
但这是非常低效的,因此我正在寻找更好的解决方案。
为什么这不起作用?
var result = out["parentOne.subParentOne.childOne"]
那么实现这一目标的最佳方法是什么?
(请注意,我正在电子上构建我的应用程序,因此我只对适用于Google chrome的可行解决方案感兴趣)
编辑 :
忘了说对象属性可以改变。当前,启动应用程序后,我将请求发送到服务器,获取示例输出,并使用以下方法解析结果以获取可用密钥:
var availableKeys = []
parseKey(out, '')
function parseKey(object, root) {
for (let key in object) {
switch (typeof object[key]) {
case 'object':
parseKey(object[key], (root === '' ? key : root + '.' + key))
break
case 'number':
availableKeys.push((root === '' ? '' : root + '.') + key)
break
default:
break
}
}
}
但是效率很低...
不,不是。这是一个字符串拆分,然后是循环访问对象的一些属性的循环。除了拆分的开销(最小)和循环的开销(最小),它的效率与一样高out.parentOne.subParentOne.childOne
。
为什么这不起作用?
var result = out["parentOne.subParentOne.childOne"]
因为那是在寻找名称为name的属性parentOne.subParentOne.childOne
,这对于JavaScript对象是一个完全有效的属性名称:
var out = {
"parentOne.subParentOne.childOne": "here's the value"
};
console.log(out["parentOne.subParentOne.childOne"]);
那么实现这一目标的最佳方法是什么?
您在问题中显示的方式,和/或在此问题的答案中详述的各种方式,从根本上讲,所有这些都归结为拆分字符串,然后像问题中的代码一样向下遍历对象层次结构。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句