2013-04-23 143 views
3

我存儲在HTML屬性驗證規則。JavaScript對象樣的字符串對象

在一個字符串文字,看起來像這樣的驗證規則:

'{required:true, minlength:2, maxlength:100}' 

爲了將其轉換爲JavaScript對象,我可以使用eval(string_literal)

然而,eval是...不愉快。

是否有替代品使用eval到對象像字符串轉換爲對象

約束是我不能使用JSON。

+1

「約束是我不能使用JSON」 ......爲什麼?這是JSON的完美用例。改變你的字符串引用鍵,它是有效的JSON。 – 2013-04-23 08:31:00

+0

不管怎樣,它不是JSON,因爲JSON中的鍵必須被雙引號....你從哪裏得到這些字符串? – 2013-04-23 08:31:13

+0

如果它是一個有效的JSON字符串,那麼你可以使用'JSON.parse( '{ 「需要」:真實的, 「使用MINLENGTH」:2, 「最大長度」:100}')'。 – dfsq 2013-04-23 08:31:15

回答

4

使用eval來自您信任的來源的良好控制的數據很好。解析器的啓動成本在最壞的情況下可以忽略不計。當然,使用eval從源不良控制的數據,你信任是一個壞主意TM

如果你不使用eval,恐怕沒有真正的捷徑,你必須自己解析字符串。如果它真的只是一個簡單的列表如圖所示,那麼使用正則表達式的split調用可以做到這一點,不需要全開分析器。

快速現成的,袖口的例子(live copy | source):

(function() { 

    var data = '{required:true, minlength:2, maxlength:100}'; 
    var entries, index, entry, parts; 

    entries = data.substring(1, data.length - 2).split(/, ?/); 

    for (index = 0; index < entries.length; ++index) { 
    entry = entries[index]; 
    parts = entry.split(/: ?/); 
    display("Key '" + parts[0] + "', value '" + parts[1] + "'"); 
    } 

    function display(msg) { 
    var p = document.createElement('p'); 
    p.innerHTML = String(msg); 
    document.body.appendChild(p); 
    } 

})(); 

當然這是完全假設的(最明顯的是,價值觀永遠不會包含逗號或冒號字符串),但同樣,如果數據很簡單,你可以避免一個完整的解析器。