【问题标题】:Property of property using String in brackets?使用括号中的字符串的属性的属性?
【发布时间】:2014-03-01 03:17:02
【问题描述】:

假设我有一个具有属性的复杂对象。

var x = {};
x.A.B = 'Hello';
x.A.C = 'World!';
x.D.E = 100;
x.D.F = 2.5;

有什么我可以放在一组方括号中以取回这些属性的吗?一个简单的测试表明x['A.B'] 不会返回'Hello'。这样做有什么语法吗?

【问题讨论】:

  • 是的,语法是使用更多的括号或点表示法。
  • x['A']['B'] 应该可以解决问题
  • 你应该使用 x['A']['B'] 或 x.A.B
  • 情况是我可能不知道我需要去多少层。我希望有一种非迭代的方式来做到这一点。
  • @CoreyOgburn 您可能想要创建一种方法来处理您的情况的随机性。例如:deepProperyExists('a.b.c', obj) 只需迭代周期数并检查每次迭代是否未定义属性。 (a, a.b, a.b.c)

标签: javascript


【解决方案1】:

如果您不想迭代,您可以在严格模式下使用eval 进行相当安全的操作。 我不建议这样做。但这是一种方法。

var x = {A:{}};
x.A.B = 'Hello';

var propertyPath = 'A.B';
var value = eval('"use strict"; x.' + propertyPath);

console.log(value);

另一种更可重用的方法是创建一个新的 Function 对象,而不是使用 eval。

function propertyValue(obj, propertyPath) {
    'use strict';
    return (new Function('obj', 'return obj.' + propertyPath))(obj);
}

var value = propertyValue(x, 'A.B');

实际上是一样的,但有明确的定义。

【讨论】:

  • 我不认为 eval 像人们试图说的那样邪恶。只要你从不评估用户给你的任何东西。
  • 我正在考虑的情况是一个内部工作应用程序,其中 propertyPath 来自 HTML 控件上的属性,这样控件可以指示它们的值将进入哪些属性(因为我们'没有使用任何数据绑定库)。它们可能是属性的属性。
  • 我用你可以使用的更有用的功能更新了我的问题
  • 使用来自this question about dates、this question about escaping strings、this question about testing for NaN 的信息以及您在上面的答案。我现在有保留类型的 getter 和 setter 函数。 JsFiddle for it
猜你喜欢
  • 2016-04-16
  • 1970-01-01
  • 2015-01-19
  • 2019-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 2013-01-23
相关资源
最近更新 更多