2016-05-18 2 views
0

habe eine kleine Frage:, ohne zu wissen, wo es in dem Baum ist

p: { 
    s: { 
    name: 'demo' 
    } 
}, 
    x: { 
     'something': 'me' 
    } 
} 

Wie kann ich Namen bekommen, ohne genau zu wissen, wo es im Objektbaum ist? Edit: Wie komme ich zu 'mir'?

+0

Nun ... während meiner ursprünglichen Lösung beteiligt 'JSON.stringify finden() 'erfüllt Ihre Bedingungen .. Ich habe zwei weitere Lösungen hinzugefügt, die rekursiv sind dies t ich; eine für den ersten Auftritt und eine für den letzten Auftritt des gesuchten Objekts. – Redu

Antwort

0

können Sie rekursiv durchlaufen:

function findByKeyName(obj, keyName) { 
    for (var key in obj) { 
     if (key === keyName) { 
      return obj[key]; 
     } else { 
      if (typeof obj[key] === "object" && obj[key] !== null) { 
       return findByKeyName(obj[key], keyName); 
      } 
     } 
    } 
} 

findByKeyName(obj, "name") //returns "demo" 
+1

Dies wird fehlschlagen, wenn eine Eigenschaft einen Wert von 'null' hat, da 'typeof'' object' zurückgibt, aber dann 'obj [key] 'fehlschlägt. –

+0

@torazaburo - Hah - guter Fang - aktualisiert – tymeJV

+0

@tyleJV thnx wirkt Wunder, ich war eigentlich ziemlich nah, aber hey du lernst, während du lebst :) –

-1

hässlich, aber wahr ...

var getValue = (o,p) => JSON.stringify(o).replace(new RegExp('.*?' + p + '":"([^"]*).+'),"$1"), 
 
obj = { 
 
    p: { 
 
     s: { 
 
     name: 'demo' 
 
     } 
 
    } 
 
}; 
 
document.write(getValue(obj,"name"));

Nun trotz meiner hässlichen Lösung funktioniert würde ich perfekt wie meine Version hinzufügen des rekursiven Ansatzes für das Gemeinwohl.

Folgendes wird das erste Aussehen der gesuchten Eigenschaft finden.

p = { 
 
    s: { 
 
    name: 'demo', 
 
    }, 
 
    x: { 
 
     'something': 'me' 
 
    }, 
 
    y: null, 
 
    z: { 
 
     'something': 'you' 
 
    } 
 
}; 
 

 
var getValue = (o,v) => { 
 
    var ok = Object.keys(o), 
 
     f = false, 
 
     i = 0; 
 
    while (!f && i < ok.length) { 
 
    \t o[ok[i]] !== null && typeof o[ok[i]] === "object" && (f = getValue(o[ok[i]],v)); 
 
    \t i++; 
 
    } 
 
    return o[v] || f; 
 
}; 
 
document.write(getValue(p,"something"));

und die folgenden wird das letzte Auftreten der gesuchten Eigenschaft

p = { 
 
    s: { 
 
    name: 'demo', 
 
    }, 
 
    x: { 
 
     'something': 'me' 
 
    }, 
 
    y: null, 
 
    z: { 
 
     'something': 'you' 
 
    } 
 
}; 
 

 
var getValue = (o,v) => { 
 
    var ok = Object.keys(o), 
 
     f = false, 
 
     i = 0; 
 
    while (!o[v] && i < ok.length) { 
 
    \t o[ok[i]] !== null && typeof o[ok[i]] === "object" && (f = getValue(o[ok[i]],v)); 
 
    \t i++; 
 
    } 
 
    return o[v] || f; 
 
}; 
 
document.write(getValue(p,"something"));

+0

Das ist schrecklich auf einer Reihe von Ebenen. –

+0

@torazaburo ich muss zustimmen .. aber es ist gültig. – Redu

Verwandte Themen