2017-04-19 178 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