2016-10-26 2 views
0

Wenn ich ein Basisobjekt, das immer das gleiche ist: project, aber manchmal muss ich zugreifen seine Felder dynamisch, wie kann ich die Felder zugreifen, wenn es kann ein oder mehr verschachtelten Objekte zum Beispiel sein:Js oder ES6 Get Objekt Feld nach Pfad Zeichenfolge, wenn Feld 2 oder mehr geschachtelte Ebenen wie in myObj.one.two.three.field hat

function (myPath){ 
    return project[myPath]; 

} 

Dies funktioniert, wenn project["oneField"] in myPath("oneField")

verwenden, aber es funktioniert nicht, wenn es verschachtelt ist oder mehr Ebenen:

myPath("one.two.fieldName") funktioniert nicht: project["one.two.fieldName"]

Weder wie folgt aus: project."one.two.fieldName"

+0

Wenn Sie fragen, für ' project ["one.two.fieldName"] 'du überprüfst, ob' project' einen Schlüssel hat, der wörtlich '' one.zwei.fieldName ''einschließlich der Punkte genannt wird. Sie können einfach auf einen Punkt splitten und ein Array erhalten, das einen Schlüssel enthält und dann das Objekt auf diese Weise durchqueren "obj = obj [keys [i]]". Oder andere ähnliche Techniken, die auf "Split" - die Ergebnisse für die Navigation "herunterkochen. – vlaz

+0

Projekt ["Eins"] ["Zwei"] ["Feldname"] –

Antwort

2

Option # 1 (nicht empfohlen) - Verwenden Sie die eval Funktion:

var projects = { 
 
    a : { 
 
    b : { 
 
     c : 1 
 
    } 
 
    } 
 
} 
 
function get(myPath) { 
 
    debugger; 
 
    return eval("projects." + myPath) 
 
} 
 
console.log(get('a.b.c'))

Option # 2 - Split von . und gehen Sie über die Elemente im Objekt:

var projects = { 
 
    a: { 
 
    b : { 
 
     c : '1' 
 
    } 
 
    } 
 
} 
 

 
function get(path) { 
 
    if (path.indexOf('.')) { 
 
    subs = path.split(".") 
 
    ret = projects; 
 
    for (var i = 0; i < subs.length; i++) { 
 
     ret = ret[subs[i]] 
 
    } 
 
    return ret; 
 
    } else { 
 
    return projects[path]; 
 
    } 
 
} 
 

 
console.log(get('a')) 
 
console.log(get('a.b')) 
 
console.log(get('a.b.c'))

1

Normalerweise, wenn ich so etwas wie dies zu tun bin ich eine rekursive Funktion verwenden werden:

var data = {a: {b: {c: 5}}}; 

function getValue(obj, key) { 
    var parts = key.split('.'); 
    return obj 
     && (parts.length === 1 
      && obj[key] || getValue(obj[parts[0]], parts.slice(1).join('.'))) 
    || null; 
} 

console.log(getValue(data, "a.b.c")); 

JSFiddle

Es ist ein bisschen kompakt geschrieben, aber im Grunde Wenn es einen Schlüssel mit einem Punkt enthält, wird es eine Ebene niedriger angezeigt. Wenn es jemals eine obj gibt, die nicht existiert, gibt es null zurück. Andernfalls wird der gefundene Wert zurückgegeben, sobald er auf der letzten Ebene ist.

Eine erweitert, vielleicht leichter zu verstehen, Version ist:

function getValue(obj, key) { 
    var parts = key.split('.'); 
    if (!obj) { 
     return null; 
    } else if (parts.length === 1) { 
     return obj[key]; 
    } 

    return getValue(obj[parts.slice(1).join('.')], key); 
} 
2

Sie es tun könnte, wie dieser (ES6):

function getVal(project, myPath){ 
 
    return myPath.split('.').reduce ((res, prop) => res[prop], project); 
 
} 
 

 
// sample data 
 
var project = { one: { two: { fieldName: 'gotcha' } } }; 
 

 
// get inner field value 
 
console.log(getVal(project, 'one.two.fieldName'));

Verwandte Themen