簡體   English   中英

JS:如何將字符串轉換為JS對象(**不**轉換為JSON)?

[英]JS : how to convert a string to JS Object (**NOT** to JSON)?

我知道如何解析有效的JSON字符串: JSON.parse('{"key" : "value"}')

但是, 有效的JS對象卻無效的JSON (如: JSON.parse("{ key : 'value'}")呢? 上面的例子拋出:

未捕獲的SyntaxError:JSON中位置2處的意外令牌k

我的實際目標更加棘手。 我想將包含RegEx (不受JSON支持,但受JS支持)的JS對象的字符串解析為JS對象:

'{ key1 : /val1/g , key2 : /val2/i }'

我最終想將這個對象與Mongoose一起使用,並找到它的文檔:

Model.find({
     key1 : /val1/g ,
     key2 : /val2/i
})

我嘗試將相當復雜的RegEx應用於我的String,用new RegEx("val1","i")替換/val1/g

str = str.replace( /\/(.+?)\/(g?i?).+?(?=,|})/g , "new RegExp(`$1`,`$2`)" )

.replace()操作工作並按照我想要的方式修改字符串。 它產生:

{ key1 : new RegExp("val1","g") , key2 : new RegExp("val2","i") }

但是當我嘗試對其應用JSON.parse時,它仍然失敗,因為new RegEx("val1","i")不是有效值。

如果您控制並信任要轉換的文本,則可以使用eval

 var str = '{ key1 : /val1/g , key2 : /val2/i }'; var obj = eval("(" + str + ")"); console.log(obj.key1); 

請注意,在執行eval ,由於表達式以{開頭,因此必須將其包裝在()以便解析器知道這是在啟動對象初始化程序,而不是塊。

關於eval注意事項:

  1. 它允許任意代碼執行。 因此,您確實必須信任要eval的文本。 不要eval用戶輸入。

  2. 直接包含對eval調用的執行上下文中的代碼基本上無法優化,因為JavaScript引擎在解析代碼時不知道字符串將包含什么。 因此,盡管從技術上講我認為這是過早的優化,但我還是將上述內容包含在您從主邏輯調用的函數中,而不是直接將其嵌入主邏輯中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM