使用对象的完整路径访问对象的属性值

费利克斯

我有一个带有许多嵌套元素的对象,像这样

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
            }
        }
    }
TJ人群

但是效率很低...

不,不是。这是一个字符串拆分,然后是循环访问对象的一些属性的循环。除了拆分的开销(最小)和循环的开销(最小),它的效率与一样高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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章