J'ai trouvé beaucoup de questions connexes avec des réponses parlant de ... dans les boucles et utilisant hasOwnProperty mais rien de ce que je fais ne fonctionne correctement. Tout ce que je veux faire, c'est vérifier s'il existe ou non une clé dans un tableau et sinon, l'ajouter.
Je commence avec un tableau vide, puis j'ajoute des clés lorsque la page est nettoyée avec jQuery.
Au départ, j'espérais que quelque chose de simple comme le suivant fonctionnerait: (en utilisant des noms génériques)
if (!array[key])
array[key] = value;
Ne pas aller. Suivi avec:
for (var in array) {
if (!array.hasOwnProperty(var))
array[key] = value;
}
A également essayé:
if (array.hasOwnProperty(key) == false)
array[key] = value;
Rien de tout cela n'a fonctionné. Soit rien n'est poussé vers le tableau ou ce que j'essaie n'est pas mieux que de simplement déclarer array[key] = value
Pourquoi quelque chose de si simple est-il si difficile à faire. Avez-vous des idées pour que cela fonctionne?
De manière générale, cela est mieux accompli avec un objet à la place car JavaScript n'a pas vraiment de tableaux associatifs:
var foo = { bar: 0 };
Utilisez ensuite in
pour rechercher une clé:
if ( !( 'bar' in foo ) ) {
foo['bar'] = 42;
}
Comme cela a été souligné à juste titre dans les commentaires ci-dessous, cette méthode est utile niquement lorsque vos clés seront des chaînes ou des éléments qui peuvent être représentés sous forme de chaînes (comme des nombres).
var a = [1,2,3], b = [4,1,5,2];
b.forEach(function(value){
if (a.indexOf(value)==-1) a.Push(value);
});
console.log(a);
// [1, 2, 3, 4, 5]
Pour plus de détails, lisez Array.indexOf
.
Si vous souhaitez vous fier à jQuery, utilisez plutôt jQuery.inArray
:
$.each(b,function(value){
if ($.inArray(value,a)==-1) a.Push(value);
});
Si toutes vos valeurs sont simplement et uniquement représentables sous forme de chaînes , cependant, vous devez utiliser un objet au lieu d'un tableau, pour un potentiel massif augmentation de la vitesse (comme décrit dans la réponse de @JonathanSampson).
Une meilleure alternative est fournie dans ES6 en utilisant des ensembles. Ainsi, au lieu de déclarer des tableaux, il est recommandé d'utiliser des ensembles si vous avez besoin d'un tableau qui ne devrait pas ajouter de doublons.
var array = new Set();
array.add(1);
array.add(2);
array.add(3);
console.log(array);
// Prints: Set(3) {1, 2, 3}
array.add(2); // does not add any new element
console.log(array);
// Still Prints: Set(3) {1, 2, 3}
Vous pouvez essayer ceci:
var names = ["Mike","Matt","Nancy","Adam","Jenny","Nancy","Carl"];
var uniqueNames = [];
$.each(names, function(i, el){
if($.inArray(el, uniqueNames) === -1) uniqueNames.Push(el);
});
moyen le plus simple de trouver des valeurs en double dans un tableau JavaScript
function check (list){
var foundRepeatingValue = false;
var newList = [];
for(i=0;i<list.length;i++){
var thisValue = list[i];
if(i>0){
if(newList.indexOf(thisValue)>-1){
foundRepeatingValue = true;
console.log("getting repeated");
return true;
}
} newList.Push(thisValue);
} return false;
}
var list1 = ["dse","dfg","dse"];
check(list1);
Sortie:
getting repeated
true
La logique est fausse. Considère ceci:
x = ["a","b","c"]
x[0] // "a"
x["0"] // "a"
0 in x // true
"0" in x // true
x.hasOwnProperty(0) // true
x.hasOwnProperty("0") // true
Il n'y a aucune raison de faire une boucle pour vérifier l'existence de clé (ou indices pour les tableaux). Maintenant, valeurs sont une autre histoire ...
Codage heureux