2011-11-29 58 views
0

我想处理一个简单的情况,我可以得到一个对象或字典。所以我要么会得到这样一个对象:简化CoffeeScript语句

obj.fields.nick 

或它会像

obj['nick'] 

我想知道是否有做以下简单的方法的字典:

value = (eval("obj.fields." + field[1]) if obj?.fields) ? eval("obj['#{field[1]}']") 

我希望做一些事情,如:

value = (obj?.fields?."#{field[1]}") ? eval("obj['#{field[1]}']") 

但如果这工作,我不会写这篇文章...

我基本上是在寻找一种方式来执行字符串的,如果

+0

如果'obj'是一个特定的类型,你是否正在使用一个特定的库来存储'obj.fields'中的属性?如果是这样,也许你应该检查'obj'是否属于这种特定类型。或者正如Ricardo在他的回答中所建议的那样,检查是否定义了“obj.fields”(鸭子打字)。 –

回答

5
value = obj.fields?[field] ? obj[field] 
# or 
value = (obj.fields ? obj)[field] 

这是一样的

if obj.fields? 
    obj.fields[field] 
else 
    obj[field] 

其实完全没有必要eval

+0

和obj.fields [field]一样是obj.fields.field?第一个对象“字段”不是字典,而是类“ – Nix

+0

@Nix:是的。在CoffeeScript和Javascript中,以下内容是等效的:'foo.bar'和'foo [”bar“]'因为每个对象都是真的一个索引散列,@Ricardo是正确的,不要使用eval,很少有很好的eval ...通常有更好的方法。 –

0

串插结构("Equals four: #{2+2}")是事物的一部分这是由coffeescript编译器处理的,因此在eval内不起作用。但假设字符串内部的命名不会改变,您可以轻松地重写它,以便eval("obj['#{field[1]}']")变为eval("obj['"+field[1]+"']")。假设我当然有你的问题。

+0

不确定你的意思?我认为你的做法与简化相反。 – Nix

+0

我以为你在做一个带有coffeescript字符串插值的'eval'时遇到了麻烦。我的假设可能是错误的,然后你插入的字符串在被评估之前被“编译”成适当的js。 –