web-dev-qa-db-fra.com

Comment obtenir un tableau de valeurs uniques à partir d'un tableau contenant des doublons en JavaScript?

Avec un tableau ['0','1','1','2','3','3','3'], le résultat devrait être ['0','1','2','3'].

107
NaveenDAlmeida

Édité

Solution ES6:

[...new Set(a)];

Alternative:

Array.from(new Set(a));

Réponse ancienne O (n ^ 2) (ne l'utilisez pas avec de grands tableaux!)

var arrayUnique = function(a) {
    return a.reduce(function(p, c) {
        if (p.indexOf(c) < 0) p.Push(c);
        return p;
    }, []);
};
257
Pedro L.

Si vous voulez maintenir l'ordre:

arr = arr.reverse().filter(function (e, i, arr) {
    return arr.indexOf(e, i+1) === -1;
}).reverse();

Puisqu'il n'y a pas d'index inversé intégré, j'inverser le tableau, filtrer les doublons, puis le ré-inverser.

La fonction de filtrage recherche toute occurrence de l'élément après l'index actuel (auparavant dans le tableau d'origine). S'il en trouve un, il jette cet élément.

Edit:

Alternativement, vous pouvez utiliser lastindexOf (si vous ne vous souciez pas de l'ordre):

arr = arr.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
});

Cela gardera des éléments uniques, mais seulement la dernière occurrence. Cela signifie que ['0', '1', '0'] devient ['1', '0'], pas ['0', '1'].

50
beatgammit

Voici une fonction de prototype de tableau:

Array.prototype.unique = function() {
    var unique = [];
    for (var i = 0; i < this.length; i++) {
        if (unique.indexOf(this[i]) == -1) {
            unique.Push(this[i]);
        }
    }
    return unique;
};
26
mahesh

Avec nderscorejs

_.uniq([1, 2, 1, 3, 1, 4]); //=> [1, 2, 3, 4]
14
fguillen

Nous sommes en 2014, et la complexité temporelle compte toujours!

array.filter(function() {
  var seen = {};
  return function(element, index, array) {
    return !(element in seen) && (seen[element] = 1);
  };
}());

http://jsperf.com/array-filter-unique/1

13
OhJeez
function array_unique(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        if (result.indexOf(arr[i]) == -1) {
            result.Push(arr[i]);
        }
    }
    return result;
}

Pas une fonction intégrée. Si la liste de produits ne contient pas l'élément, ajoutez-le à la liste unique et renvoyez-la.

9
Raekye

Voilà! Je vous en prie!

Array.prototype.unique = function()
{
    var tmp = {}, out = [];
    for(var i = 0, n = this.length; i < n; ++i)
    {
        if(!tmp[this[i]]) { tmp[this[i]] = true; out.Push(this[i]); }
    }
    return out;
}

var a = [1,2,2,7,4,1,'a',0,6,9,'a'];
var b = a.unique();
alert(a);
alert(b);
6
Julius Loa

Vous pouvez trouver toutes sortes d'implémentations de tableaux uniques ici:

http://jsperf.com/distinct-hash-vs-comparison/12

http://jsperf.com/array-unique-functional

Je préfère les styles fonctionnels tels que:

var arr = ['lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg', 'lol', 'dfgfg', 'car', 1, 'car', 'a', 'blah', 'b', 'c', 'd', '0', '1', '1', '2', '3', '3', '3', 'crazy', 'moot', 'car', 'lol', 1, 'fdgdfg'];

var newarr = arr.reduce(function (prev, cur) {
    //console.log(prev, cur);
    if (prev.indexOf(cur) < 0) prev.Push(cur);
    return prev;
}, []);

var secarr = arr.filter(function(element, index, array){
    //console.log(element, array.indexOf(element), index);
    return array.indexOf(element) >= index;
});

//reverses the order
var thirdarr = arr.filter(function (e, i, arr) {
    //console.log(e, arr.lastIndexOf(e), i);
    return arr.lastIndexOf(e) === i;
});

console.log(newarr);
console.log(secarr);
console.log(thirdarr);
3
CMCDragonkai

Une autre approche consiste à utiliser un objet pour le stockage initial des informations du tableau. Puis reconvertis. Par exemple:

var arr = ['0','1','1','2','3','3','3'];
var obj = {};

for(var i in arr) 
    obj[i] = true;

arr = [];
for(var i in obj) 
    arr.Push(i);

La variable "arr" contient maintenant ["0", "1", "2", "3", "4", "5", "6"]

1
Jason Graves

Pas de tableau "retour" redondant, pas d'ECMA5 (j'en suis sûr!) Et simple à lire.

function removeDuplicates(target_array) {
    target_array.sort();
    var i = 0;

    while(i < target_array.length) {
        if(target_array[i] === target_array[i+1]) {
            target_array.splice(i+1,1);
        }
        else {
            i += 1;
        }
    }
    return target_array;
}
1
Amiga500Kid

Voici comment vous pouvez supprimer les valeurs en double du Array.

function ArrNoDupe(dupArray) {
   var temp = {};
    for (var i = 0; i < dupArray.length; i++) {
         temp[dupArray[i]] = true;
         var uniqueArray = [];
       for (var k in temp)
           uniqueArray.Push(k);
 return uniqueArray;
    }
}
1
Mitul Maheshwari

Cela fonctionnera. L'essayer.

function getUnique(a) {
  var b = [a[0]], i, j, tmp;
  for (i = 1; i < a.length; i++) {
    tmp = 1;
    for (j = 0; j < b.length; j++) {
      if (a[i] == b[j]) {
        tmp = 0;
        break;
      }
    }
    if (tmp) {
      b.Push(a[i]);
    }
  }
  return b;
}
1
Darshan
function array_unique(nav_array) {
    nav_array = nav_array.sort(function (a, b) { return a*1 - b*1; });      
    var ret = [nav_array[0]];       
    // Start loop at 1 as element 0 can never be a duplicate
    for (var i = 1; i < nav_array.length; i++) { 
        if (nav_array[i-1] !== nav_array[i]) {              
            ret.Push(nav_array[i]);             
        }       
    }
    return ret;     
}
1
NaveenDAlmeida

J'aime utiliser ceci. Il n'y a rien de mal à utiliser la boucle for, j'aime bien utiliser les fonctions intégrées. Vous pouvez même passer un argument booléen pour la correspondance de conversion de type ou non, ce qui vous permettrait dans ce cas d'utiliser une boucle for (la méthode/fonction filter() effectue la correspondance de conversion (===)).

Array.prototype.unique =
function()
{
    return this.filter(
        function(val, i, arr)
        {
            return (i <= arr.indexOf(val));
        }
    );
}
1
DrunkenBeetle

Ceux d’entre vous qui travaillent avec la bibliothèque de fermeture google ont à leur disposition goog.array.removeDuplicates, ce qui est identique à unique. Cela change cependant le tableau lui-même.

0
akond