2014-11-14 140 views
0

在JavaScript中,我可以这样创建对象:如何从字符串形式的对象字面值创建对象?

var Obj = {someName:"My Name",someNumber:43}; 

我试图做这样的事情(JSFiddle):

var str = '{someName:"My Name",someNumber:43}'; 
var Obj = new Object(str); 
document.getElementById("result").innerHTML = 'Name: '+Obj.someName; 

但结果将是"Name: undefined"。它不是读取符号,而是为每个字符串的字符形成一个枚举对象的对象。为什么?有没有办法通过字符串中的描述来创建对象?

我不想使用JSON格式,因为JSON需要对每个属性名称使用双引号,这对于经常输入而言非常痛苦,并不适合查看并导致更大的字符串。如果可能,我希望使用JavaScript对象文字符号。

编辑2:这是我将工作(与更多的时间)。它适用于一个级别的对象,我会考虑如何使它以递归方式工作以便转换多维对象或数组。这个问题已经结束,所以...祝你好运!

Object.defineProperty(String.prototype, "isObject", { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: function(){ 
     var string = this; 
     if(string.length<=1) return false; 
     return (string.charAt(0)=="{" && string.charAt(string.length-1)=="}"); 
    } 
}); 
Object.defineProperty(String.prototype, "isArray", { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: function(){ 
     var string = this; 
     if(string.length<=1) return false; 
     return (string.charAt(0)=="[" && string.charAt(string.length-1)=="]"); 
    } 
}); 
Object.defineProperty(String.prototype, "toObject", { 
    enumerable: false, 
    configurable: false, 
    writable: false, 
    value: function(){ 
     var string = this; 
     if(!string.isObject() && !string.isArray()) return false; 
     var object = string.isObject(); 
     string = string.slice(1,-1); 
     var Obj = (object)? new Object() : new Array() ; 
     var Termos = string.split(","); 
     var i, Elems, n=0, val; 
     for(i in Termos){ 
      Elems = Termos[i].split(":"); 
      if(Elems.length==1) { 
       val = Elems[0]; 
       if(object){ 
        Obj[n] = val; 
       } else { 
        Obj.push(val); 
       } 
       n++; 
      } else { 
       if(Elems[1].isObject() || Elems[1].isArray()){ 
        val = Elems[1].toObject(); 
       } else if(typeof(Elems[1])=="number") { 
        val = Elems[1]; 
       } else { 
        Elems[1] = Elems[1].replace(/['"]+/g, ''); 
        val = Elems[1]; 
       } 
       if(object){ 
        Obj[Elems[0]] = val; 
       } else { 
        Obj.push(val); 
       } 
      } 
     } 
     return Obj; 
    } 
}); 
+1

你可以标记为重复的,如果你认为JSON作为唯一的答案。是吗?也许转换为JSON,以便它可以被解析... – Gustavo 2014-11-14 17:36:46

+0

您提交的代码将不适用于其中含有','的字符串文字。 ;) – 2014-11-23 03:24:52

回答

0

您可以使用

var str = '{someName:"My Name",someNumber:43}'; 

var strToParse = str.replace("{","").replace("}","").split(","); 
for(var i = 0;i < strToParse.length;i++){strToParse[i] = '\"'+strToParse[i].split(":")[0]+'\":'+strToParse[i].split(":")[1];} 

strToParse="{"+strToParse+"}"; 
var Obj = JSON.parse(strToParse); 
+0

不是JSON。在JSON中,var名称必须在引号内:“someName”:“我的名字”。 JSON.parse不起作用。 – Gustavo 2014-11-14 17:33:46

+0

@Gustavo现在有一点点长,但工作:) – nicael 2014-11-14 17:52:11

+0

我在想这样的事情,不认为有一个缩短的方式,但我会等待更长的时间为其他建议,谁知道...我的自己的解决方案不使用JSON,因此在将字符串转换为数组后,属性将逐个创建。我会在稍后发布。 – Gustavo 2014-11-14 21:36:18