2013-04-23 104 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); 
    } 

})(); 

当然这是完全假设的(最明显的是,价值观永远不会包含逗号或冒号字符串),但同样,如果数据很简单,你可以避免一个完整的解析器。