使用JSON中的方法创建JS对象

我需要以下对象:

var myObj={ "rules": { "email": { "required": true, "email": true, "remote": { "url": "check-email.php", "type": "post", "data": { "someName1": function() { return $( '#someID1' ).val(); }, "someName2": function() { return $( '#someID2' ).val(); }, "someName3": "bla" } } } } }; 

要创建它,我只有一些JSON,如下所示:

 { "rules": { "email": { "required": true, "email": true, "remote": { "url": "check-email.php", "type": "post", "data": { "someName1": {"id":"someID1"}, "someName2": {"id":"someID2"}, "someName3": "bla" } } } } } 

要么

 { "rules": { "email": { "required": true, "email": true, "remote": { "url": "check-email.php", "type": "post", "data": { "someName1": {"function":"return $( '#someID1' ).val()"}, "someName2": {"function":"return $( '#someID2' ).val()"}, "someName3": "bla" } } } } } 

或类似的东西。

如何实现这一目标?

您可以使用Function来动态创建函数。 假设您有第二个JSON结构:

 d = obj.rules.email.remote.data; Object.keys(d).forEach(function(key) { d[key] = new Function(d[key].function); //Note: You might want to check if d[key].function exists before using it. }); 

对于这种模式:

 { "rules": { "email": { "required": true, "email": true, "remote": { "url": "check-email.php", "type": "post", "data": { "someName1": {"id":"someID1"}, "someName2": {"id":"someID2"}, "someName3": "bla" } } } } } 

可以这样做:

 for(var key in myObj.rules.email.remote.data){ if(myObj.rules.email.remote.data[key].id){ myObj.rules.email.remote.data[key] = function(){ return $('#'+myObj.rules.email.remote.data[key].id).val(); } } } 

如果电子邮件没有硬编码,则可以按以下方式完成:

 for(var key1 in myObj.rules){ for(var key in myObj.rules[key1].remote.data){ if(myObj.rules[key1].remote.data[key].id){ myObj.rules[key1].remote.data[key] = function(){ return $('#'+myObj.rules[key1].remote.data[key].id).val(); } } } }