简化CoffeeScript语句

简化CoffeeScript语句,coffeescript,Coffeescript,我正在尝试处理一个简单的例子,在这个例子中,我可能会得到一个对象,或者一本字典。所以我要么得到一个像这样的物体: obj.fields.nick 或者它会像一本字典 obj['nick'] 我想知道是否有一种更简单的方法可以做到以下几点: value = (eval("obj.fields." + field[1]) if obj?.fields ) ? eval("obj['#{field[1]}']") 我希望做一些类似的事情: value = (obj?.fields?."#{fie

我正在尝试处理一个简单的例子,在这个例子中,我可能会得到一个对象,或者一本字典。所以我要么得到一个像这样的物体:

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]}']")  
但如果那样做有效的话,我就不会写这篇文章了


我基本上是在寻找一种执行字符串的方法,作为if的一部分。字符串插值构造(
“等于4:#{2+2}”
)是由coffeescript编译器处理的,因此在
eval
中不起作用。但是假设字符串中的东西的命名没有改变,您可以轻松地重写它,这样
eval(“obj['{field[1]}]]”
就变成了
eval(“obj[''++field[1]+'])
。当然,假设我答对了你的问题。

字符串插值构造(
“等于4:#{2+2}”
)是由coffeescript编译器处理的,因此不会在
eval
中工作。但是假设字符串中的东西的命名没有改变,您可以轻松地重写它,这样
eval(“obj['{field[1]}]]”
就变成了
eval(“obj[''++field[1]+'])
。当然,假设我答对了你的问题

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

if obj.fields?
    obj.fields[field]
else
    obj[field]
绝对不需要
eval

这和

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

绝对不需要
eval

不知道你的意思?我认为你做的与简化相反。我假设你在做
eval
时遇到了麻烦,其中有一个coffeescript字符串插值。我当时的假设可能是错误的,在对字符串求值之前,插入的字符串被“编译”到正确的js中。不确定你的意思是什么?我认为你做的与简化相反。我假设你在做
eval
时遇到了麻烦,其中有一个coffeescript字符串插值。当时我的假设可能是错误的,您插入的字符串在被求值之前被“编译”到正确的js中。obj.fields.field是否与obj.fields[field]相同?第一个对象“fields”不是字典,而是一个类“@Nix:是的。在CoffeeScript和Javascript中,以下对象是等效的:
foo.bar
foo[“bar”]
因为每个对象实际上都是一个索引哈希。而且@Ricardo是正确的。不要使用eval。很少有好的eval案例……通常有更好的方法。obj.fields.field与obj.fields[field]相同吗?第一个对象“fields”不是字典,而是一个类。@Nix:是的。在CoffeeScript和Javascript中,以下内容是等效的:
foo.bar
foo[“bar”]
,因为每个对象实际上都是一个索引哈希。而@Ricardo是正确的。不要使用eval。很少有好的评估案例。。。通常有更好的方法。如果
obj
是特定类型,您是否使用在
obj.fields
中存储属性的特定库?如果是这样,也许您应该检查
obj
是否属于该特定类型。或者正如里卡多在回答中所建议的那样,检查是否定义了
obj.fields
(duck typing)。如果
obj
是一种特定类型,您是否使用一个特定的库来存储
obj.fields
中的属性?如果是这样,也许您应该检查
obj
是否属于该特定类型。或者像里卡多在回答中建议的那样,检查是否定义了
obj.fields
(duck typing)。