2016-10-10 5 views
0

sagen, dass ich eineGet JSON-Wert als Zeichenfolge?

var BOB = { 
"name": "bob", 
"height": 185 
}; 

Objekt haben, und ich habe ein anderes Objekt, das von ihm

var PROPS = { 
"bob": { 
    "height": BOB.height 
}; 

PROPS.bob.height wird 185 So nun einen Wert verweist gleich. Wenn ich das Objekt stringify, erhalte ich

{"bob": {"height": 185}} 

Kann ich den String-Wert herauszufinden, was beurteilt den Wert 185 zurückzukehren. z.B. Ermitteln Sie den Quellcode aus dem Code ...:

var s = findOutTheSourceCode(PROPS); 

// s would be 
/* 
{ 
"bob": { 
    "height": BOB.height 
} 
*/ 
+1

Nein, kannst du nicht! – adeneo

+1

Können Sie erklären, was Sie erreichen möchten? – Rajesh

+0

Sie können alle Objekteigenschaften durchlaufen, um den Pfad zu finden. Aber es wird nur funktionieren, wenn die Werte eindeutig sind – k102

Antwort

0

Im Allgemeinen, nein. Diese Information wird nicht gespeichert.


Wenn der Code Teil einer Funktion ist und Sie diese Funktion einen Verweis und Sie werden mit einem JS-Engine, die diese Nicht-Standard-Funktion unterstützt, dann können Sie thatfunction.toString() anrufen und dann versuchen, Finden Sie das relevante Bit des Codes unter Verwendung (zum Beispiel) des Mustervergleichs.

0

Dies ist eine wirklich schlechte Idee aus der Sicht des Entwurfs.

Wie auch immer, auf Ihre Frage antwortet die kurze Antwort "NEIN, du kannst nicht".

Aber es gibt eine hässliche Antwort, die ja sagt, auf Kosten der unter Berufung auf mit eval, die eine noch schlechteste Idee. Beispiel:

var BOB = { 
"name": "bob", 
"height": 185 
}; 

var PROPS_src = '{\n' 
    + ' "bob": {\n' 
    + ' "height": BOB.height\n' 
    + ' }' 
    + '}'; 

eval('var PROPS = '+PROPS_src); 

console.log("PROPS_SRC:__________________"); 
console.log(PROPS_src); 
console.log("PROPS:______________________"); 
console.log(PROPS); 

// Output: 
// PROPS_SRC:__________________ 
// { 
// "bob": { 
//  "height": BOB.height 
// }} 
// PROPS:______________________ 
// { bob: { height: 185 } } 

Aber, wie gesagt, das alles ist eine wirklich schlechte Idee. Ich empfehle Ihnen kaum, Ihre Datenstrukturen (und den Code bei Bedarf) so umzugestalten, dass Sie die Datenherkunft zurückverfolgen können.

Für (schnell und schmutzig) Beispiel:

var people = { 
    bob: { 
    "name": "bob", 
    "height": 185 
    } 
}; 

var props = { 
    "bob": { 
    "someConstant": "Hello World", 
    "_height": "height", 
    } 
}; 

function getProps(who){ 
    var out = {}; 
    Object.keys(props[who]).map(function(k){ 
     if (k.substring(0,1) == "_") { 
      out[k.substring(1)] = people[who][props[who][k]]; 
     } else { 
      out[k] = props[who][k]; 
     }; 
    }); 
    return out; 
}; 

console.log("Raw:", props['bob']); 
console.log("Calculated:", getProps('bob')); 

// Output: 
// Raw: { someConstant: 'Hello World', _height: 'height' } 
// Calculated: { someConstant: 'Hello World', height: 185 }