2010-11-16 5 views
1

J'ai fondamentalement une petite fonction appelée findItem() qui est censée trouver les éléments que je recherche en fonction des attributs personnalisés data- de l'élément.jQuery: Comment faire une boucle sur un ensemble d'éléments en trouvant seulement ceux qui correspondent aux valeurs dans un autre tableau?

Dans ce cas, ils sont purement numériques, par exemple. data-slide=1.

Je suis un peu désemparé quant à la façon de faire correspondre la valeur de la diapositive de données de chaque élément à celle qui est contenue dans l'autre tableau.

Voici un exemple plus concret:

function findItem(count) { 
    var collection = []; 

    $.each(allMyLiItems, function(i, item) { 

     if ($(item).data('slide') == count) { 
      collection.push(item); 
     } 

    }); 

    return $(collection); 
} 
findItem([1,3]) 

qui ne fonctionne pas parce count dans l'instruction if ne semble pas correspondre à quelque chose.

La page contient 4 <li data-slide="{number}">… éléments donc 1,3 devrait renvoyer le premier et le troisième de ces éléments.

Qu'est-ce que je fais mal ici?

Répondre

5

Utilisez jQuery.grep et jQuery.inArray:

function findItem(items) { 
    return jQuery.grep($('li'), function(element, index) { 
     return jQuery.inArray($(element).data('slide'), items) != -1; 
    }); 
} 

Working example

+0

Hmm ... je l'ai copié/collé dans mon fichier mais en déconnectant le résultat de 'findItem ([1,3])' renvoie le 3ème 'li' 3 fois au lieu des 1er et 3ème' li' une fois, chacun. Une idée de ce que je fais mal? – Jannis

+0

@Jannis, Essayez ma mise à jour, j'ai aussi donné un exemple sur jsFiddle. –

+0

J'ai vérifié notre violon, mais dès que vous ajoutez plus de 'li's il casse encore, voir ma mise à jour de violon ici: http://jsfiddle.net/UVFBu/1/ – Jannis

1

Pour résoudre le problème avec le count dans le cas statment rien correspondant, essayez ceci:

function findItem(count) { 
    var collection = [], 
      count = count; 

    $.each(allMyLiItems, function(i, item) { 

     if ($(item).data('slide') == count) { 
      collection.push(item); 
     } 

    }); 

    return $(collection); 
} 
findItem([1,3]) 

Cela va créer une fermeture de sorte que la fonction anonyme à l'intérieur du each sera en mesure de le voir.

Votre deuxième problème est le fait que vous transmettez count en tant que tableau. Ainsi, la condition if a besoin d'un peu de fixation:

function findItem(count) { 
    var collection = [], 
      count = count; 

    $.each(allMyLiItems, function(i, item) { 

     if (count.indexOf($(item).data('slide')) !== -1) { 
      collection.push(item); 
     } 

    }); 

    return $(collection); 
} 
findItem([1,3]) 
+0

Merci, mais il ne parvient toujours pas superliga 'count' dans l'instruction if est l'ensemble du tableau, pas les numéros individuels étant appariés à nouveau. donc count dans l'instruction if est '[1,3,4]' ce qui n'est pas '== 1', ce que l'instruction if demanderait. – Jannis

+0

Désolé Jannis, vous devez avoir écrit votre commentaire pendant que je le mettais à jour. La seconde moitié devrait résoudre votre problème. –

+0

Oui, je l'ai fait en effet. J'ai appliqué votre solution mise à jour et cela fonctionne très bien. Merci beaucoup. – Jannis

Questions connexes