2016-07-22 15 views
0

Ich muss ein JSON-Objekt analysieren, das eine Zeichenfolge, Array, Array von Zeichenfolgen und Array von Objekt sein kann. Ich erkannte, dass es von Anfang an nicht gut ist, dass ein Objekt viele Typen haben kann, aber ich kann den Code nicht von Upstream ändern, also muss ich es stattdessen in meinem Code behandeln. Ich baue eine Pixelbibliothek für einen modernen Browser, also verwende ich keine jQuery oder lodash. Ich unterstütze die meisten modernen Browser und IE> = 9JavaScript, um String, Objekt und Array unterzubringen

Hier ist das Beispiel der Daten, die

"author": { 
"@type": "Person", 
"name": "Author" 
} 

Oder

"author":[{"@type":"Person","name":"Author"}] 

Oder

"author": 'Author' 

zurückgegeben werden kann oder

"author": ['Author', 'Author1'] 

Und das ist mein Code.

Meine Frage ist, gibt es einen besseren Weg, dies auf eine effizientere Weise zu tun?

+3

wahrscheinlich besser über http: //codereview.stackexchange. com/ – tymeJV

+1

nicht alles versuchen, nur der Teil, der explodieren kann ... – dandavis

Antwort

1

Wie wäre:

switch (typeof authors) { 
    case 'object': 
     if (Array.isArray(authors)) { 
      authors = authors.map((author) => { 
       if (typeof author === 'object' && author.name) { 
        return author.name; 
       } else { 
        return author; 
       } 
      }); 
     } else { 
      authors = [authors.name]; 
     } 
    break; 
    case 'string': 
     authors = authors.split(','); 
    break; 
    case 'undefined': 
     // 
    break; 
} 
1

Nur für das Protokoll: hier ist ein minimalistischer , noch funktionsfähige Version.

switch((Array.isArray(authors) && 1) | (typeof authors[0] == 'string' && 2)) { 
    case 0: return [authors.name]; 
    case 1: return [authors[0].name]; 
    case 2: return authors.split(','); 
    case 3: return authors; 
} 

JSFiddle

unnötig zu sagen, mit einem minimalistischen Schutz gegen unerwartete Eingänge sowie ...