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
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)]
À 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"]
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);
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}`)
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);
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}))));
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()
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);
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);