[Javascript] ¿Cómo combino O lógico con Y lógico dentro de un selector de atributo jQuery?


Answers

Puede combinar múltiples selectores, pero su sintaxis no es exactamente correcta:

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

Esto encuentra todos los elementos <usuario> con el estado "CA" y cualquier otro nodo (no necesariamente <usuario>) con estado "NV". Lo que quieres es:

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

Si no quieres repetirlo:

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

Dado el siguiente XML:

<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>

Usando jQuery, ¿hay alguna manera de seleccionar usuarios que sean hombres y que sean de CA o NV, pero sin usar la función de filtro? Para ser claro, sé que

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

selecciona solo usuarios masculinos, mientras

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

selecciona a todos los usuarios de CA o NV. Pero no puedo combinarlos con un Y lógico dentro de un solo selector.

Sin embargo, al usar la función de filtro, funciona lo siguiente:

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

¡Gracias!