2017-09-13 4 views
0

Ich erhalte eine große, verschachtelte JSON-Antwort von einer Online-API. Ich benötige nur 3 Werte davon, aber sie sind ziemlich verschachtelt. Ich kenne den genauen Pfad zu jedem dieser Felder. Zum Beispiel gegeben:Abrufen eines Werts von einem JSON-Objekt über seinen Pfad

obj = { 
    "result": { 
     "data": { 
      "point1": "x", 
      "value": 2 
     }, 
     "foo": { 
      "bar": 7 
     } 
    } 
} 

Und der Weg let p = 'result.data.value' Ich mag würde in der Lage sein let x = getElement(obj, p); zu tun haben und x sein 2.

Ich schrieb eine einfache Funktion (entfernt alle Fehlerprüfung sauber zu halten):

const getJSONElement = (data, path) => { 
    for(let p of path.split('.')) { 
    data = data[p]; 
    } 
    return data; 
}; 

Es funktioniert, aber ich fühle mich wie ich etwas vermisse, oder nicht effizient sein. Gibt es einen besseren Weg, um zum Element zu gelangen (vielleicht mit Array.reduce)?

+0

Wenn eine Bibliothek zu importieren ist eine Option, ich würde selectn empfehlen: https://github.com/wilmoore/selectn.js. Es funktioniert für Ihren Fall, kann aber auch mit Null-Checks, Array-Indizes usw. umgehen. –

+0

Oder https://stackoverflow.com/questions/8817394/javascript-get-deep-value-from-object-by-passing-path -to-it-as-string oder https://stackoverflow.com/questions/6491463/accessing-nested-javascript-objects-with-string-key oder https://stackoverflow.com/questions/8051975/access-object -child-properties-using-a-dot-notation-string oder https://stackoverflow.com/questions/6393943/convert-javascript-string-in-dot-notation-into-an-object-reference – meagar

+0

Dank @meagar Ich habe versucht, nach ähnlichen Fragen zu suchen, aber ich denke, ich habe es nicht gut genug versucht. Auf jeden Fall bekam ich die Antwort mit 'reduce', das ist ein Plus :) –

Antwort

1

Sie könnten das Objekt mit den aufgeteilten Pfadwerten reduzieren.

var object = { result: { data: { point1: "x", value: 2 }, foo: { bar: 7 } } }, 
 
    path = 'result.data.value', 
 
    getValue = (o, p) => p.split('.').reduce((r, k) => r[k], o); 
 

 
console.log(getValue(object, path));

Verwandte Themen