2016-09-04 7 views
8

muszę filtrować listę elementów, które składają się z dwóch zasadniczych danych atrybuty:mieszania logiczne AND i OR w selektor jQuery

<li class="song" data-title="freedom" data-id="7" data-tags="tag-18-eot,tag-2-eot" data-category="1">Freedom</li> 
  1. Kategoria
  2. Tagi

filtrowania wg kategorii powinno być logiczne OR, ale filtrowanie przez tagi powinno być logiczne AND.

Filtrowanie za pomocą jednego z tych dwóch elementów nie stanowi problemu.

że stosowane, na przykład:

$(collection).filter('li[data-tags*="tag-50-eot"][data-tags*="tag-51-eot"]'); 

filtrować przez znaczniki. Lub:

$(collection).filter('[data-category="1"], [data-category="2"]); 

, aby przefiltrować według kategorii.

To działa dobrze. Jednak nie mogłem znaleźć sposobu na połączenie tych dwóch selektorów w jedno pojedyncze zapytanie, które można przekazać do funkcji filter(), a połączenie łańcuchowe dwóch wywołań filter() nie prowadzi do pożądanego wyniku, ponieważ pierwsze wywołanie może odfiltrować elementy, które drugie połączenie pozostawiło za sobą.

Znalazłem this question o podobnym temacie, ale problem jest trochę inny i podejście również.

Jak prawidłowo odfiltrować te elementy?

+1

próbowałeś prosto łańcuchowym z I w pierwszej kolejności? –

+0

_chaining dwóch wywołań filter() nie prowadzi do pożądanego rezultatu, ponieważ pierwsze połączenie może odfiltrować elementy, które pozostawi drugie połączenie ._ Co sprawia, że ​​tak uważasz? – hindmost

+0

Nie masz pewności, jaki jest oczekiwany wynik? Zwróć wszystkie elementy, które mają ustawione atrybuty 'data-tags' i' data-category'? – guest271314

Odpowiedz

6

Powinieneś być w stanie uzyskać to, czego szukasz, używając łańcucha, pod warunkiem, że najpierw użyjesz warunku AND. Na przykład:

var res = $('#collection li') 
    .filter('li[data-tags*="tag-50-eot"][data-tags*="tag-51-eot"]') 
    .filter('[data-category="1"], [data-category="2"]'); 

Fiddle here.

-2

funkcja filtrowania można otrzymać funkcję jak wejście ...

może skończyć się konstruktem odczuwalna:

var set = $(collection).filter(
function(index, element) 
{ 
    return ($(element).attr(...) == "..."); 
} 
); 
+0

Nie rozumiem ... Myślę, że celem strony jest wskazanie ludzi we właściwym kierunku, a nie wykonywanie ich pracy. –