web-dev-qa-db-fra.com

comment empêcher l'ajout de clés en double à un tableau javascript

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?

31
iamsar

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).

38
Sampson
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).

29
Phrogz

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}
2
Pavan

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

1
Bruno Pinna
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
0
abhiagNitk

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

0
user166390