2017-04-19 99 views
0

我有了不明物体像这样的JSON数据:如何将字符串转换为对象属性?

var x = { 
    "unknown1": 234, 
    "unknown2": 324 
} 

我可以得到属性名称:

var prop1 = Object.keys(x)[0]; 

现在我想找到这个属性的值。我明显可以做x[prop1],但我想做x.prop1。我的问题是:

  • 什么办法prop1转换成表情,这样我可以使用x.prop1
  • 如果eval可以解决这个问题,那么在这种情况下如何以及为什么会评估安全问题?
+1

那么,根据点语法的性质,'x.prop1'将总是给你x对象的字面属性“prop1”。因此,除非您调用新属性“prop1”,否则您没有选择,只能使用括号语法。 – mhodges

+0

作为一个后续:我真的很好奇,为什么你不想使用括号语法? – mhodges

+3

“我明显可以做x [prop1]” - *,你应该* - “但我想做x.prop1” - 不要那么做。这是工作的错误工具。 – Quentin

回答

4

什么是将prop1转换为表达式以便我可以使用x.prop1的方法?

如果不生成源代码并编译/评估它,则不能。

如果eval可以解决这个问题,那么在这种情况下eval如何以及为什么会产生安全问题?

是的,eval(和它的亲戚new Function)可以做到这一点。如果您的eval ing来自不可信来源,那只是一个安全问题。如果您确信prop1的值不包含恶意内容,那么您可以使用eval("x." + prop1)来执行此操作。或者new Function("x", "return x." + prop1)(x)

但是没有很好的理由。只需使用x[prop1]。这就是括号符号。这是正常的做法,它不必启动解析器和代码生成器,速度更快,而且您不必担心其中含有恶意代码。如果你使用的是evalnew Function,那么而不是正常的做法,它必须启动一个解析器和代码生成器,它比较慢,而且你在脑海中有这种琐碎的担忧。所以使用x[prop1]。 :-)

+0

虽然不是安全问题,但'eval'很慢,可以用范围做怪异的事情。 – Quentin

+0

@Quentin:它*速度较慢*,当然;这个时代并不慢。 '“x”没有范围问题。 + prop1'。但是,据我所知,我们同意,没有什么好理由使用'eval'(或'new Function')来做括号记号已经做了...... :-) –

+0

@TJCrowder我不确定我会说这是可能的OP,大声笑。 – mhodges

0

正如@mhodges在他的评论中说的,你可以添加一个新的属性。

但这样做看起来可能是多余的。

x.prop1 = x[Object.keys(x)[0]] 
+0

不对男人你使用括号符号来定义属性..我想如果你真的想全力以赴,你应该使用Object.defineProperty()而不是 – mhodges