Avec un tableau ['0','1','1','2','3','3','3']
, le résultat devrait être ['0','1','2','3']
.
É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;
}, []);
};
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'].
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;
};
Avec nderscorejs
_.uniq([1, 2, 1, 3, 1, 4]); //=> [1, 2, 3, 4]
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);
};
}());
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.
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);
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);
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"]
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;
}
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;
}
}
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;
}
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;
}
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));
}
);
}
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.