2014-11-14 137 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