2012-04-06 4 views
3

Ich bin ein JSON-Objekt wieDie Suche nach einer Immobilie in einem JSON-Objekt

tags = {"jon":["beef","pork"],"jane":["chicken","lamb"]}; 

zu schaffen, die aus einem Array wie

$arr = array(
     'jon' => array('beef', 'pork'), 
     'jane' => array('chicken', 'lamb') 
     ); 
$tags = json_encode($arr); 

Und ich mag mit PHP generiert wurden prüfen, ob etwas in ist Das Eine oder das Andere. Keiner von ihnen zu funktionieren scheint, aber so etwas wie

if('lamb' in tags.jane)) { 
    console.log('YES'); 
} else { 
    console.log('NO'); 
} 

schreibt NO an die Konsole

if('foo' in tags.jane)) { 
    console.log('YES'); 
} else { 
    console.log('NO'); 
} 

schreibt auch NO an die Konsole

so bei

suchen
typeof(tags.jane); 

es zeigt es eine "object" aber

console.log(tags); 

zeigt das ist folgende:

Object 
jane: Array[2] 
    0: "chicken" 
    1: "lamb" 
    length: 2 
    __proto__: Array[0] 
jon: Array[2] 
    0: "beef" 
    1: "pork" 
    length: 2 
    __proto__: Array[0] 
__proto__: Object 

so dachte ich, vielleicht tags.jane tatsächlich ein Array sein kann und versucht

if($.inArray('lamb', tags.jane)) { 
    console.log('YES'); 
} else { 
    console.log('NO'); 
} 

die JA auf die Konsole schreibt aber

if($.inArray('foo', tags.jane)) { 
    console.log('YES'); 
} else { 
    console.log('NO'); 
} 

schreibt auch YES an die Konsole.

Erstelle ich das JSON-Objekt falsch? Den Wert nicht richtig anvisieren? Jeder Rat wird sehr geschätzt. Wenn dies einfacher wäre als ein Array anstelle eines Objekts, habe ich die volle Kontrolle, es zu ändern. Ich bin nur ein bisschen ratlos, wie ich das behandeln soll.

+0

Verwenden Sie JSON.parse (jsonString), um die Serverantwort in ein JavaScript-Objekt zu konvertieren. –

+2

+1 für eine * gründliche * Demonstration dessen, was Sie versucht haben. –

+0

Tut mir leid, ich habe nicht erwähnt, dass ich den JSON in der JS analysiert habe, aber so oder so haben Sergio (und andere) mir gegeben, was ich brauchte. Danke allen! Aus Neugier, warum sind Tags.jane und tags.jon Arrays statt "verschachtelte Objekte" ist das einfach nicht in JSON möglich? Als ich damit anfing, dachte ich, ich würde einen Scheck wie if (tags.jane.chicken) machen und erwarten, dass es wahr oder falsch zurückgibt, wenn die Immobilie existiert. ich muss offensichtlich etwas über JSON-Objekte lesen. : P Nochmals vielen Dank an alle, die sich gemeldet haben. – ocergynohtna

Antwort

4

jQuery.inArray gibt -1 zurück, wenn das Element nicht gefunden wurde. Das ist true Wert aus dem POV von Javascript. Versuchen Sie dies:

if($.inArray('foo', tags.jane) != -1) { 
3

Ihre zweite Reihe von Antworten sind die Art, wie Sie gehen sollten. $ .inArray gibt jedoch einen Index und keinen booleschen Wert zurück. Jede Ganzzahl ungleich Null ist wahr, dh wenn foo nicht gefunden wird, gibt sie -1 zurück, was zu true und YES wird.

Ebenso würde $.inArray('chicken', tags.jane)0 zurückgeben und auf false umwandeln, was auch nicht die Antwort ist, die Sie wollen.

Verwenden Sie stattdessen $.inArray('foo', tags.jane) !== -1 als Ihre Bedingung.

+0

+1 für die "0 ist falsch" :) –

2

Tags.name gibt Ihnen das Array für diese Person. So würde $.inArray("chicken",tags.jane) sehen, ob "Huhn" in Janes Tags-Array ist. Wenn dies nicht der Fall ist, erhalten Sie -1, andernfalls würde Ihre Position im Array liegen (in Ihrem Beispiel würde dies null, das erste Array-Element, liefern).

1

Sie verwenden das Schlüsselwort aus dem falschen Grund. Die Anweisung (prop 'in' obj) überprüft, ob das Objekt (assoziiertes Array) eine Eigenschaft mit dem Wert prop hat. Da Sie das Schlüsselwort 'in' für ein Array verwenden, wird false zurückgegeben, da tags.jane ein Array mit Indizes und kein zugeordnetes Array mit Eigenschaften ist.

Wenn Sie wissen möchten, ob sich Werte im Array befinden, durchlaufen Sie sie und vergleichen Sie sie. Wenn Sie das 'in' Schlüsselwort verwenden möchten, dann konvertieren Sie Ihr Array in ein Objekt wie folgt.

tags = {}; 
    // old code 
    tags.jane = ['lamb', 'food']; 
console.log(('lamb' in tags.jane) === false) 
    // new code 
    tags.jane = { 
     'lamb':1, 
     'food':1 
    } 
console.log(('lamb' in tags.jane) === true) 

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

+0

ahhhhh !! fabelhaft! Danke für diesen Larry. – ocergynohtna

0

Sie nicht

if('foo' in tags.jane)) 

es verwendet werden soll als

if (1 in tags.jane) 

, wenn Sie in tags.jane möchten überprüfen, 'foo' verwenden können, versuchen Sie dies

var inIt = (function() { 
    var inIt = false; 
    tags.jane.forEach(function(item) { 
     inIt = inIt || 'foo' == item; 
    }); 
    return inIt; 
})(); 
Verwandte Themen