2011-11-29 105 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。 –