2017-03-07 2 views
0

Ich versuche, JSON.stringify() rekursiv zu replizieren. Ich bin ein wenig verwirrt, warum ich in meiner zurückgegebenen JSON-Zeichenfolge undefiniert bin. Hier ist, was ich bisher getan:Rekursion verwenden, um eine JSON-Zeichenfolge zu erstellen (replizieren stringify)

var testobj = {num:123,str:"This is a string",bool:true,o:{x:1,y:2},iamnull:null} 
 
var count = 0 
 
var stringifyJSON = function(obj) { 
 

 
    // your code goes here 
 
    if(obj === undefined){ 
 
    \t return console.log("obj was undefined"); 
 
    } 
 
    count = count + 1 
 
    if(count > 20){ //I put this here mostly to stop infinite loops assuming this function wouldn't occur over 20 times. 
 
    \t return console.log("failed") 
 
    } 
 
    var endarray = []; 
 
if(obj !== undefined && typeof(obj)==='object'){ //If the object isn't undefined and the object is an object... 
 

 
    for(var prop in obj){ 
 
    \t console.log('"' + prop + '"'); 
 
    \t endarray.push(stringifyJSON(prop) +'"' + ':' +'"'+ stringifyJSON(obj[prop])) //push the items into the array, using recursion. 
 
    } 
 
    if(typeof(obj) !== undefined){ 
 
    \t return '{' + endarray.join() + '}' 
 
    } 
 
} 
 

 
    
 
    
 
}; 
 

 
//end result is "{undefined":"undefined,undefined":"undefined,undefined":"undefined,undefined":"{undefined":"undefined,undefined":"undefined},undefined":"{}}" 
 

 
//JSON values cannot be a function, a date, or undefined

Könnte jemand zeigen, wo ich falsch gehe? Bei der Rekursion habe ich ein Problem, die Ursache des Problems zu identifizieren.

+1

Mit Rekursion versuchen Sie, ein Ergebnis irgendeiner Art zu sammeln. In diesem Fall "Endarray". Sie setzen es jedoch in jeder Iteration Ihrer Rekursion auf ein leeres Array zurück. Sie müssen "endarray" außerhalb der rekursiven Funktion deklarieren und Ihre Ergebnisse aufbauen, bis Sie fertig sind. – rasmeister

+0

'typeof (obj)! == undefined' Dies wird immer 'wahr' sein. Verwenden Sie 'typeof' nicht, um nach' undefined' zu suchen. Es ist ein kurzsichtiger und unnötiger Hack, der nur Probleme verursacht. –

+0

Sie können 'stringifyJSON' definieren, um zwei Parameter zu akzeptieren, überprüfen Sie, ob 'endarray' definiert ist, wenn ja, drücken Sie Werte auf das Array, andernfalls erstellen Sie' endarray'. Beachten Sie jedoch, dass native 'JSON.stringify()' - Implementierung mehr als nur ein Objekt oder Array als Parameter akzeptieren kann. – guest271314

Antwort

1

Es gibt ein paar Dinge, die benötigt werden, um zur richtigen Lösung zu gelangen.

Erstens haben Sie keinen Basisfall für Ihre Rekursion, daher wird auf der Basisebene jedes rekursiven Trace nichts zurückgegeben (d. H. Undefined wird implizit zurückgegeben). Zuerst müssen Sie einen Basisfall hinzufügen, in dem Ints, Strings, Boolesche und andere primitive Typen in Strings konvertiert werden.

Zweitens müssen Sie auch überprüfen, dass obj !== null vor Ihrem rekursiven Aufruf, weil typeof(null) zu "object" ausgewertet wird, seltsam genug.

var testobj = {num:123,str:"This is a string",bool:true,o:{x:1,y:2},iamnull:null} 
var count = 0 
var stringifyJSON = function(obj) { 

    // your code goes here 
    if(obj === undefined){ 
    return console.log("obj was undefined"); 
    } 
    count = count + 1 
    if(count > 20){ //I put this here mostly to stop infinite loops assuming this function wouldn't occur over 20 times. 
    return console.log("failed") 
    } 
    var endarray = []; 
if(obj !== undefined && obj !== null && typeof(obj)==='object'){ //If the object isn't undefined and the object is an object... 

    for(var prop in obj){ 
    console.log('"' + prop + '"'); 
    endarray.push(stringifyJSON(prop) +'"' + ':' +'"'+ stringifyJSON(obj[prop])) //push the items into the array, using recursion. 
    } 
    if(typeof(obj) !== undefined){ 
    return '{' + endarray.join() + '}' 
    } 
} 
if (obj !== undefined) {return String(obj)} 


}; 
+0

Dies war bisher die engste Antwort, da es den Testobj zurückgibt, aber die Zitate sind nur an den falschen Stellen in der Antwort. – Milos

+0

Ich bin froh zu helfen. Ich habe das Zitat-Problem bemerkt, aber Ihre ursprüngliche Frage wurde nach den undefinierten Fragen gestellt. Darauf habe ich mich konzentriert. Hoffentlich können Sie die Zitate selbst herausfinden, aber wenn nicht, zögern Sie nicht, für weitere Hilfe zu schreiben. :) –

Verwandte Themen