web-dev-qa-db-fra.com

jQuery - supprime les doublons d'un tableau de chaînes

Duplicata possible:
moyen le plus simple de trouver des valeurs en double dans un tableau JavaScript
jQuery.unique sur un tableau de chaînes

J'essaie d'obtenir une liste de voisins par recherche en largeur (pour être précis: les index des boules voisines de même couleur dans Block'd ) ma function getWholeList(ballid) retourne un tableau comme

thelist=["ball_1","ball_13","ball_23","ball_1"]

et bien sûr il y a des doublons.

J'ai essayé de les supprimer avec jQuery.unique (); mais cela ne fonctionne pas avec les chaînes, je suppose, alors y a-t-il un moyen pour cela (rendre le tableau unique)?

Merci pour toute aide..

31
void

La jQuery méthode unique ne fonctionne que sur un tableau d'éléments DOM.

Vous pouvez facilement créer votre propre fonction uniqe en utilisant les méthodes each et inArray :

function unique(list) {
  var result = [];
  $.each(list, function(i, e) {
    if ($.inArray(e, result) == -1) result.Push(e);
  });
  return result;
}

Démo: http://jsfiddle.net/Guffa/Askwb/

65
Guffa

En tant que solution non jquery, vous pouvez utiliser la méthode Arrays filter comme ceci:

var thelist=["ball_1","ball_13","ball_23","ball_1"], 
    thelistunique = thelist.filter(
                 function(a){if (!this[a]) {this[a] = 1; return a;}},
                 {}
                );
//=> thelistunique = ["ball_1", "ball_13", "ball_23"]

Comme extension à Array.prototype (en utilisant un rappel raccourci filter)

Array.prototype.uniq = function(){
  return this.filter(
      function(a){return !this[a] ? this[a] = true : false;}, {}
  );
}
thelistUnique = thelist.uniq(); //=> ["ball_1", "ball_13", "ball_23"]

[Edit 2017] Une version ES6 de ceci pourrait être:

Array.from(["ball_1","ball_13","ball_23","ball_1"]
           .reduce( (a, b) => a.set(b, b) , new Map()))
     .map( v => v[1] );
10
KooiInc

Essayez celui-ci - Array.unique ()

Array.prototype.unique =
  function() {
    var a = [];
    var l = this.length;
    for(var i=0; i<l; i++) {
      for(var j=i+1; j<l; j++) {
        // If this[i] is found later in the array
        if (this[i] === this[j])
          j = ++i;
      }
      a.Push(this[i]);
    }
    return a;
  };
thelist=["ball_1","ball_13","ball_23","ball_1"]
thelist=thelist.unique()
8
white

jQuery.unique () ne fonctionne que pour un tableau d'éléments DOM. Jetez un œil à ceci (version améliorée d'unique):

nique amélioré

2
obe6

Il existe un port JavaScript du PHP array_unique fonction ici: http://phpjs.org/functions/array_unique

function array_unique (inputArr) {
    var key = '',
        tmp_arr2 = {},
        val = '';

    var __array_search = function (needle, haystack) {
        var fkey = '';
        for (fkey in haystack) {
            if (haystack.hasOwnProperty(fkey)) {
                if ((haystack[fkey] + '') === (needle + '')) {
                    return fkey;
                }
            }
        }
        return false;
    };

    for (key in inputArr) {
        if (inputArr.hasOwnProperty(key)) {
            val = inputArr[key];
            if (false === __array_search(val, tmp_arr2)) {
                tmp_arr2[key] = val;
            }
        }
    }

    return tmp_arr2;
}

Ou à partir de JS plus tard:

arr.filter((v, p) => arr.indexOf(v) == p)
2
Petah