web-dev-qa-db-fra.com

Filtrer un tableau pour n'avoir que des valeurs uniques

J'ai besoin de filtrer mon tableau pour ne contenir que des valeurs uniques . Ce sont mes données de tableau

["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]

résultat attendu devrait être

["X_row7", "X_row4", "X_row6", "X_row10", "X_row11", "X_row8"]

Comment dois-je continuer mon code pour obtenir un résultat correct.

newArray = [];
for(n in data){
  if(!newArray.indexOf(n)){
     newArray.Push(n);
  }
}
console.log(newArray);

Si vous avez besoin d'informations supplémentaires, merci de me le faire savoir et je vous fournirai. Je vous remercie

15
Valor_

Vous pouvez utiliser Array.filter function pour filtrer les éléments d’un tableau en fonction de la valeur de retour d’une fonction de rappel. La fonction de rappel s'exécute pour chaque élément du tableau d'origine.

La logique de la fonction de rappel est la suivante: si la valeur indexOf de l'élément actuel est identique à celle de l'index, cela signifie que l'élément a été rencontré pour la première fois et qu'il peut donc être considéré comme unique. Si ce n'est pas le cas, cela signifie que l'élément a déjà été rencontré et doit donc être ignoré maintenant.

var arr = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"];

var filteredArray = arr.filter(function(item, pos){
  return arr.indexOf(item)== pos; 
});

console.log( filteredArray );

MISE À JOUR (16 nov. 2017)

Si vous pouvez compter sur ES6 features , vous pouvez alors utiliser Set object and Spread operator pour créer un tableau unique à partir d'un tableau donné, comme indiqué dans la réponse de @ Travis Heeter ci-dessous:

var uniqueArray = [...new Set(array)]
41
Mohit Bhardwaj

À compter du 15 juin 2015, vous pouvez utiliser Set() pour créer un tableau unique:

var uniqueArray = [...new Set(array)]

Pour votre exemple:

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]
var newArray = [...new Set(data)]
console.log(newArray)

>> ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"]
14
Travis Heeter

Vous pouvez utiliser une table de hachage pour rechercher et filtrer toutes les valeurs non incluses.

var data = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"],
    unique = data.filter(function (a) {
        return !this[a] && (this[a] = true);
    }, Object.create(null));

console.log(unique);

5
Nina Scholz

arr = ["I", "do", "love", "JavaScript", "and", "I", "also", "do", "love", "Java"];

uniqueArr = [... new Set(arr)];

// or

reallyUniqueArr = arr.filter((item, pos, ar) => ar.indexOf(item) === pos)

console.log(`${uniqueArr}\n${reallyUniqueArr}`)

4
Jesse Dirisu

Vous pouvez utiliser Carte et Spread Operator :

var rawData = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"];

var unique = new Map();
rawData.forEach(d => unique.set(d, d));
var uniqueItems = [...unique.keys()];

console.log(uniqueItems);

3
Morteza Tourani

Vous pouvez utiliser reduce pour boucler le tableau et obtenir les valeurs non dupliquées. Utilise également un aux object pour obtenir le nombre de valeurs ajoutées .

var aux = {};

var newArray = ["X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11", "X_row7", "X_row4", "X_row6", "X_row10", "X_row8", "X_row9", "X_row11"].reduce((tot, curr)=>{
  if(!aux[curr]){
    aux[curr] = 1;
    tot.Push(curr);
  }
  return tot;
}, []);

console.log(newArray);

J'ai toujours utilisé:

unique = (arr) => arr.filter((item, i, s) => s.lastIndexOf(item) == i);

Mais récemment, je devais obtenir des valeurs uniques pour:

["1", 1, "2", 2, "3", 3]

Et mon ancien serveur de réserve ne l'a pas coupé, alors je suis arrivé avec ceci:

uunique = (arr) => Object.keys(Object.assign({}, ...arr.map(a=>({[a]:true}))));
1
TennisVisuals
Array.prototype.unique = function () {
  return [...new Set(this)]
}

alors on peut écrire:

const arr = [1, 5, 2, 2, 2, 3, 4, 3, 2, 1, 5]
const uniqueArr = arr.unique()
1
Zuhair Taha

Une légère variation de la méthode indexOf, si vous devez filtrer plusieurs tableaux:

function unique(item, index, array) {
    return array.indexOf(item) == index;
}

Utiliser comme tel:

arr.filter(unique);
1
omikes

Ceci est pour es2015 et plus haut autant que je sache. Il existe des options "plus propres" avec ES6 mais c'est un excellent moyen de le faire (avec TypeScript).

let values: any[] = [];
const distinct = (value: any, index: any, self: any) => {
    return self.indexOf(value) === index;
};
values = values.filter(distinct);
0
CodeAssist