74 votes

Fonction jQuery pour obtenir tous les éléments uniques d'un tableau?

http://api.jquery.com/jQuery.unique/ vous permet d'obtenir des éléments uniques d'un tableau, mais les docs disent que la fonction est surtout pour un usage interne et ne fonctionne que sur des éléments du DOM. Une autre SORTE de réponse, a déclaré l'unique fonction() a travaillé sur les nombres, mais que ce cas d'utilisation n'est pas nécessairement dans l'avenir, car il n'est pas explicitement indiqué dans les docs.

Compte tenu de cela, est-il un "standard" de la fonction jQuery pour accéder uniquement les valeurs uniques-plus précisément, les primitives comme des entiers -- dans un tableau? (Évidemment, on peut construire une boucle à chaque fonction (), mais nous sommes à nouveau jQuery et voudrais savoir si il y a un fonction jQuery pour cela.)

132voto

kennebec Points 33886

Vous pouvez utiliser un tableau. filtre pour retourner le premier élément de chaque valeur distincte

 var a=[1,5,1,6,4,5,2,5,4,3,1,2,6,6,3,3,2,4];

var unique=a.filter(function(itm,i,a){
    return i==a.indexOf(itm);
});

alert(unique);

/*
returned value: (Array)
1,5,6,4,2,3
*/
 

Si la prise en charge de IE8 et des versions antérieures est principale, n'utilisez pas la méthode de filtrage non prise en charge.

Autrement,

 If(!Array.prototype.filter){

    Array.prototype.filter= function(fun, scope){
        var T= this, A= [], i= 0, itm, L= T.length;
        if(typeof fun== 'function'){
            while(i<L){
                if(i in T){
                    itm= T[i];
                    if(fun.call(scope, itm, i, T)) A[A.length]= itm;
                }
                ++i;
            }
        }
        return A;
    }
}
 

54voto

js1568 Points 4323

Utilisez simplement ce code comme base d’un simple plugin JQuery.

 $.extend({
    distinct : function(anArray) {
       var result = [];
       $.each(anArray, function(i,v){
           if ($.inArray(v, result) == -1) result.push(v);
       });
       return result;
    }
});
 

Utilisez comme tel:

 $.distinct([0,1,2,2,3]);
 

14voto

Dennis Points 373

Basé sur la réponse de @ kennebec, mais corrigé pour IE8 et inférieur en utilisant des wrappers jQuery autour du tableau pour fournir les fonctions de tableau manquantes filter et indexOf :

Le wrapper $ .makeArray () n'est peut-être pas absolument nécessaire, mais vous obtiendrez des résultats étranges si vous omettez ce wrapper et JSON.stringify le résultat autrement.

 var a = [1,5,1,6,4,5,2,5,4,3,1,2,6,6,3,3,2,4];

// note: jQuery's filter params are opposite of javascript's native implementation :(
var unique = $.makeArray($(a).filter(function(i,itm){ 
    // note: 'index', not 'indexOf'
    return i == $(a).index(itm);
}));

// unique: [1, 5, 6, 4, 2, 3]
 

10voto

lawnsea Points 2226

Je voudrais utiliser underscore.js , qui fournit une méthode uniq qui fait ce que vous voulez.

6voto

zyklus Points 31683

Parcourir le tableau et pousser des objets dans une table de hachage que vous les rencontrez. Référence croisée de la valeur de hachage pour chaque nouvel élément.

Notez que cela ne fonctionnera correctement que pour les primitives (chaînes de caractères, nombres, null, undefined, NaN) et quelques objets à sérialiser la même chose (fonctions, des chaînes, des dates, éventuellement, des tableaux, selon le contenu). Hachages dans ce entreront en collision, comme ils ont toutes les sérialiser à la même chose, par exemple "[object object]"

Array.prototype.distinct = function(){
   var map = {}, out = [];

   for(var i=0, l=this.length; i<l; i++){
      if(map[this[i]]){ continue; }

      out.push(this[i]);
      map[this[i]] = 1;
   }

   return out;
}

Il n'y a également aucune raison que vous ne pouvez pas utiliser jQuery.unique. La seule chose que je n'aime pas, c'est qu'elle détruit la commande de votre tableau. Voici le code exact pour cela, si vous êtes intéressés:

Sizzle.uniqueSort = function(results){
    if ( sortOrder ) {
        hasDuplicate = baseHasDuplicate;
        results.sort(sortOrder);

        if ( hasDuplicate ) {
            for ( var i = 1; i < results.length; i++ ) {
                if ( results[i] === results[i-1] ) {
                    results.splice(i--, 1);
                }
            }
        }
    }

    return results;
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X