Comment combiner OR logique avec AND ET logique dans un sélecteur d'attributs jQuery?

Étant donné le XML suivant:

<users> <user state="CA" sex="m">Max</user> <user state="AZ" sex="f">Jen</user> <user state="OR" sex="f">Kim</user> <user state="NV" sex="m">Bob</user> <user state="CA" sex="m">Jon</user> <user state="AZ" sex="m">Jim</user> <user state="OR" sex="f">Joy</user> <user state="NV" sex="f">Amy</user> </users> 

À l'aide de jQuery, existe-t-il un moyen de sélectionner des utilisateurs masculins et CA ou NV, mais sans utiliser la fonction de filtrage? Pour être clair, je sais que

 $(xml).find("user[sex='m']") 

Sélectionne uniquement les utilisateurs masculins,

 $(xml).find("user[state='CA'],[state='NV']") 

Sélectionne tous les utilisateurs de CA ou NV. Mais je ne suis pas capable de combiner les deux avec un ET logique dans un seul sélecteur.

En utilisant la fonction de filtrage, cependant, les travaux suivants:

 $(xml).find("user").filter(function() { return $(this).attr('sex') == 'm' && ($(this).attr('state') == 'CA' || $(this).attr('state') == 'NV') }).each(function() { alert($(this).text()); }); 

Merci!

Essaye ça:

 $(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']") 

Fondamentalement, vous encadrez les attributs de sex et d' state dans un seul sélecteur simple (ce serait votre ET logique) et répétez-les une fois par état (et ce serait votre OR logique).

Tester:

 $(xml).find("user[sex='m'][state='CA'], user[sex='m'][state='NV']") .each(function() { alert($(this).text() + " - " + $(this).attr('state')); }); 

Sortie:

 Max - CA Bob - NV Jon - CA 

Vous pouvez combiner plusieurs sélecteurs, mais votre syntaxe n'est pas exactement exacte:

 $(xml).find("user[state='CA'],[state='NV']") 

Cela trouve tous les éléments <user> avec l'état "CA" et tous les autres nœuds (pas nécessairement <utilisateur>) avec l'état "NV". Ce que vous voulez, c'est:

 $(xml).find("user[state=CA][sex=m],user[state=NV][sex=m]") 

Si vous ne voulez pas vous répéter:

 $(xml).find("user").filter("[state='CA'],[state='NV']").filter("[sex='m']");