2016-07-15 12 views
1

Ich habe ein Objekt. Ich möchte prüfen, ob eine bestimmte Eigenschaft darin existiert oder nicht.Finden Sie spezifische Eigenschaft in einem Objekt

Das Problem ist: die Eigenschaft, nach der ich suche, könnte überall sein, d. H. Die Struktur des Objekts ist undefiend.

ex:

obj1 = { "propIWant": "xyz" } 
obj2 = { "prop1": [ {"key": "value"}, {"key":"value"}, 1, {"key": { "propIWant": "xyz"}}] 

ich folgendes versucht haben, aber es scheint zum Scheitern verurteilt:

var lastTry = function(entry){ 
    // if entry is an array 
    if(typeof entry === 'object' && entry instanceof Array){ 
    for(var i in entry) 
     entry[i] = this.lastTry(entry[i]); 
    } 
    // if entry is a normal object 
    else if(typeof entry === 'object'){ 
    // iterate through the properties of the entry 
    for(var key in entry){ 
     console.log('key is: ', entry[key]) 
     // in case the entry itself is an array 
     if(typeof entry[key] === 'object' && entry[key] instanceof Array){ 
     for(var i in entry[key]){ 
      entry[key][i] = this.lastTry(entry[key][i]); 
     } 
     } 
     // in case the entry is a simple object 
     else if(typeof entry[key] === 'object') { 
     console.log('entry[key] is an object', entry[key], key) 
     // if we directely find the property.. modify it 
     if(entry[key].hasOwnProperty('_internal_url')){ 
      **entry[key]['_internal_url'] = "http://localhost:4000"+entry[key]['_internal_url'];** <-- My objective 
     } 
     else{ 
      // call this method again on that part 
      // for(var i in entry[key]){ 
      // if(typeof entry[key][i] === 'object') 
      //  entry[key][i] = this.lastTry(entry[key][i]); 
      // } 
     } 
     }else{ 
     console.log('not found') 
     } 
    } 
    } 
} 

Kann mir bitte jemand damit helfen, fand ich folgendes: Find by key deep in a nested object aber Anstatt den gefundenen Teil zurückzugeben, möchte ich die Eigenschaft bearbeiten und das gesamte Objekt mit der geänderten Eigenschaft zurückgeben, nicht nur die Teilmenge des Objekts, das diese Eigenschaft hat.

+0

@DominicTobias in sie suchen –

+0

Mögliche Duplikat [Suchen nach Schlüssel tief in verschachtelten JSON-Objekt] (http://stackoverflow.com/questions/15523514/find-by-key-deep-in-nested- json-object) – morels

Antwort

0

Haben Sie versucht:

obj1.hasOwnProperty('propIWant') 
0

Wenn Sie nur überprüfen, ob Eigenschaft vorhanden ist oder nicht, das Objekt stringify und dann überprüfen, ob Wert in Zeichenkette vorhanden ist oder nicht.

var obj2 = { 
 
    "prop1": [{ 
 
     "key": "value" 
 
    }, { 
 
     "key": "value" 
 
    }, 
 
    1, { 
 
     "key": { 
 
     "propIWant": "xyz" 
 
     } 
 
    } 
 
    ] 
 
} 
 

 
var key = 'propIWant'; 
 
var key2 = 'propIWant1'; 
 

 
function isPropInObject(obj, prop) { 
 
    var r = new RegExp(prop + "\":") 
 
    var match = JSON.stringify(obj).match(r); 
 
    return match && match.length > 0 ? true : false 
 
} 
 

 
console.log(isPropInObject(obj2, key)) 
 
console.log(isPropInObject(obj2, key2))

+0

Das obige könnte ein Problem erzeugen: Wenn das Objekt der Wert einer Sammlung von HTML-Element-Ausgaben ist (sagen wir mal, das Textfeld hat etwas, das mit dem übereinstimmt, was ich suche, könnte es am Ende manipuliert werden) auch). Nette Idee, aber in diesem Fall funktioniert es möglicherweise nicht wie beabsichtigt –

+0

Dann denke ich, dass Sie Ihre Frage aktualisieren sollten. – Rajesh

+0

Nach reiflicher Überlegung habe ich die Daten stringfiziert und gesucht. Die Tiefensuche der Objekteigenschaft gibt das Objekt mit der Eigenschaft zurück, d. H. Ich kann die Eigenschaft des Objekts, nach dem ich gesucht habe, nicht ändern. Danke für deine Hilfe :) –

0

Nun, überprüfen, ob die Requisiten Objekte selbst und verwendet eine rekursive Funktion, die „tief“ Eigenschaft zu finden, die Sie suchen?

function findProp(obj, lookFor) { 
    for (var prop in obj) { 
    if (prop == lookFor) return obj[prop] 
    if (typeof obj[prop] == 'object') { 
     var checkNested = findProp(obj[prop], lookFor)  
     if (checkNested) return checkNested 
    } 
    } 
    return false 
} 

Es arbeitet mit console.log(findProp(obj2, 'propIWant'))

Demo ->http://jsfiddle.net/zqcurg70/

+0

Danke! Ist es möglich, die Eigenschaft zu manipulieren und das gesamte Objekt zurückzugeben? Es wird immer der gesuchte Wert zurückgegeben. Meine Idee ist, sein Eigentum zu ändern. Nochmals vielen Dank :) –

+0

@RamanathanIyer, Wenn ich verstehe, was Sie meinen, dann könnten Sie ein Objekt wie diese aktualisierte Geige zurückgeben -> ** http: //jsfiddle.net/2cab85L3/** – davidkonrad

+1

@davidkonrad Nur ein kleiner Zeiger, stattdessen von 'return false' als Standardwert, gib nichts zurück oder' return undefined'. 'false' kann ein gültiger Wert sein. – Rajesh

0

Arrays und Objekte Daten können den Zugriff auf einen gemeinsamen Weg:

obj[key] and arr[pos];

Auf diese Weise können Sie vereinfachen Sie Ihren Code. Bitte beachten Sie, dass key eine Zeichenfolge im Falle eines Objekts oder einer Nummer im Falle eines Arrays sein kann.

Die folgende Version durchsucht nur das Element und eventuelle untergeordnete Elemente (sowohl Arrays als auch Objekte) in einer Tiefenlogik.

var found = 0; 
var findProp = function(entry) { 

    if(typeof entry === 'object') 

    for(var key in entry) { 

     findProp(entry[key]); 

     if(entry[key].hasOwnProperty('_internal_url')) { 
     found++; 
     entry[key]['_internal_url'] = "http://localhost:4000" + entry[key]['_internal_url']; 
     } 
    } 
} 

console.log('found ' + found + 'occurrences'); 
Verwandte Themen