2014-04-10 15 views
5

Podając łańcuch jako notacji kropki, w jaki sposób utworzyć obiekt z tego łańcucha (sprawdzanie dla już istniejących właściwości): npKonwersja ciąg z kropką notacji JSON

var obj = {}; 
stringToObj('a.b', 'value1', obj); 
stringToObj('a.b.c', 'value2', obj); 

przyniosłoby

{ 
    "a": { 
    "b": { 
     "_x": "value1", 
     "c": { 
      "_x": "value2" 
     } 
    } 
    } 
} 

Spojrzałem na this question i this one, ale żaden z nich nie wydaje się wystarczający dla tego co robię.

Jakieś myśli?

+2

Nie ma tu JSON. –

+0

Lub obiekt .. potato/potAto .. –

+1

Bardziej jak jabłko/pomarańcza. JSON to ciąg reprezentujący obiekt w notacji zgodnej z JavaScript. Obiekt to ... obiekt. –

Odpowiedz

8

Można skorzystać z odnośników:

function stringToObj(path,value,obj) { 
    var parts = path.split("."), part; 
    while(part = parts.shift()) { 
     if(typeof obj[part] != "object") obj[part] = {}; 
     obj = obj[part]; // update "pointer" 
    } 
    obj["_x"] = value; 
} 
+0

Geniusz. Dzięki. –

6

dla tych, którzy szukają rozwiązania bez _x w obiekcie spróbuj tego kodu. Nieznaczna modyfikacja powyższego kodu (co jest genialna)

stringToObj = function(path,value,obj) { 
    var parts = path.split("."), part; 
    var last = parts.pop(); 
    while(part = parts.shift()) { 
    if(typeof obj[part] != "object") obj[part] = {}; 
    obj = obj[part]; // update "pointer" 
    } 
obj[last] = value; 
} 

jako bonus powyższy kod będzie działać, jeśli chcesz zaktualizować części istniejącego obiektu :)

var obj = {a:{b:3}}; 
stringToObj("a.b",10,obj); 
console.log(obj); //result : {a:{b:10}}