2017-11-06 1 views
-1

Ich arbeite an einem Weg, der Vorteil der Replacement-Funktion Argument in JSON.Stringify in JavaScript nutzt, um die Wort-Case (toUpper/toLower-Fall) zu ändern, das Problem ist mein JSON ist nicht gerade Schlüssel: Wert, einige Werte sind auch Schlüssel und sie haben selbst Werte, also muss ich alle Schlüssel und Werte durchgehen, prüfen, ob der Wert auch ein Schlüssel ist und sicherstellen, dass ich die Groß- und Kleinschreibung (toUpper oder toLower) für alle Schlüssel und Werte ändere. Ich weiß, dass die Replacement-Funktion in JSON.Stringify (Objekt, ReplacerFunction) durch alle Schlüssel und Werte iteriert und die Änderungen im Inneren dann Schlüssel und Werte zurückgibt, aber obwohl ich darüber für eine Weile gelesen habe, kann ich nicht anwenden es, und ich bin mir nicht sicher, ob ich Rekursion innerhalb der Replacer-Funktion anwenden sollte oder wie jede Hilfe geschätzt wird.Wie verwende ich JSON Stringify, um alle Schlüssel und Werte zu ersetzen?

Code I hatte:

function _replacer(name,val){ 
    if(typeof val != "object"){ 
     return val.toString().toUpperCase() 
    } 
    if(typeof name != "object"){ 
      return name.toString().toUpperCase() 
     } 

    console.log("key = "+name+" type: "+typeof name); 
    console.log("value ="+val+" type: "+typeof val); 

    } 

auch:

function _replacer(name,val){ 
    if(typeof val != "object" &&typeof val ==="string"){ 
     return val=val.toUpperCase() 
    } 
    if(typeof name != "object" &&typeof name ==="string"){ 
      name=name.toUpperCase() 
     } 
    return val; 
    } 

Auch schließlich i zu diesem Zeitpunkt bekam:

var res = JSON.parse(JSON.stringify(j, function(key, value) { 
     return typeof value === "string" ? value.toUpperCase() : value 
    })); 

aber dieser Code nutzt nur den sehr niedrigen Pegelwert , nicht alle Schlüssel/Werte, der Grund ist, weil ich nur einen Wert von der Replacer-Funktion, die in diesem Fall ist, zurückgeben kann e der Wert.

+0

Teilen Sie den Code, den Sie versucht haben. – jmargolisvt

+0

@jmargolisvt, geteilt. – HMA

+0

Es erstaunt mich, wie viel mehr Leute meine vernünftige Frage ablehnen, anstatt etwas Nützliches zu sagen. – HMA

Antwort

0

Die replacer Funktion in JSON.stringify, ermöglicht es Ihnen nicht, Schlüssel zu ersetzen, wie documented in MDN. Sie können Werte umwandeln oder Schlüssel/Wert-Paare ganz weglassen (indem Sie undefined zurückgeben).

Ihre beste Wette ist wahrscheinlich, das Objekt zu transformieren, bevor Sie es stringieren. Unterstrich oder Lodash würde dies recht einfach machen, aber man kann es nativ tun, ohne zu viel Mühe wie folgt aus:

const xform = obj => { 
    return Object.keys(obj).reduce((xformed, key) => { 
    let value = obj[key] 

    if (typeof value ==='string') value = value.toUpperCase() 
    else if (typeof value === 'object') value = xform(value) 

    xformed[key.toUpperCase()] = value 
    return xformed 
    }, {}) 
} 

console.log(JSON.stringify(xform({a: 'b', c: 1, d: {e: 'f'}}))) 
// {"A":"B","C":1,"D":{"E":"F"}} 

Sie auch RegEx verwenden könnte und replacenach es Zeichenfolge, wenn Sie so geneigt sind. Der Code ist sicherlich kürzer, aber vielleicht weniger lesbar:

const stringified = JSON.stringify({a: 'b', c: 1, d: {e: 'f'}}) 
console.log(stringified.replace(/".+?"/g, s => s.toUpperCase())) 
// {"A":"B","C":1,"D":{"E":"F"}} 
+0

danke, aber was ist s => s, der Wert von s ? – HMA

+0

Es ist eine [ES6 Pfeilfunktion] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions). 's => s' ist in etwa äquivalent zu' function (s) {return s} '. Sie sind beide Funktionen, die einen einzelnen Parameter ("s") nehmen und dann zurückgeben (oder es in meiner Antwort in der oberen zurückgegeben). Die Unterschiede sind etwas technischer Natur, vor allem, dass Pfeilfunktionen keine "This" - oder "Arguments" -Objekte haben. –

Verwandte Themen