javascript - 在javascript中如何动态获取对象的嵌套属性

标签 javascript object

var arr = { foo : 1, bar: { baz : 2 }, bee : 3 }

function getter(variable) {
  return arr[variable];
}

如果我想要“foo”与“bee”,我只需执行arr[variable] - 这很简单,函数就可以做到这一点。

但是如果我想获得 arr.bar.baz AKA arr[bar][baz] 该怎么办?

我可以将什么传递给 getter 函数来让我做到这一点(当然也让我使用相同的函数获取非嵌套属性)。

我尝试了 getter('bar.baz')getter('[bar][baz]') 但这些都不起作用。

我想我可以解析点或括号(如下所示: In javascript, test for property deeply nested in object graph? )。有更干净的方法吗? (当然除了评估。)

特别是因为我需要在循环中为一堆数组元素多次正确设置深度。

最佳答案

您可以使用基于路径字符串的深度访问函数。请注意,属性名称中不能包含任何句点。

function getPropByString(obj, propString) {
  if (!propString)
    return obj;

  var prop, props = propString.split('.');

  for (var i = 0, iLen = props.length - 1; i < iLen; i++) {
    prop = props[i];

    var candidate = obj[prop];
    if (candidate !== undefined) {
      obj = candidate;
    } else {
      break;
    }
  }
  return obj[props[i]];
}

var obj = {
  foo: {
    bar: {
      baz: 'x'
    }
  }
};

console.log(getPropByString(obj, 'foo.bar.baz')); // x
console.log(getPropByString(obj, 'foo.bar.baz.buk')); // undefined

如果访问字符串为空,则返回该对象。否则,继续沿着访问路径直到倒数第二个访问者。如果这是一个对象,则返回最后一个对象[访问器]值。否则,返回未定义。

关于javascript - 在javascript中如何动态获取对象的嵌套属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44901032/

相关文章:

javascript - 是否可以告诉 jsdoc 在与源代码分开的文件中查找该代码的文档?

javascript - 固定字体大小的html Canvas ,如何在放大/缩小时改变它

javascript - Vue JS : Open Menu Component with Button, 单击菜单外关闭

javascript - 向右移动 div 动画不起作用

python - 如何捕获在python中的对象上调用的任何方法?

java - 自定义 Java 序列化

HTML 对象和音频标签

javascript - 当值为空时如何隐藏表中的行?

c# - 如何使用 xml 创建 C# 对象

java - 在java中将设置存储在对象数据类型的散列图中的替代方案?