333 votes

Array.push() s'il n'existe pas ?

Comment puis-je pousser dans un tableau si aucune des valeurs n'existe ? Voici mon tableau :

[
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" },
    { name: "tom", text: "tasty" }
]

Si j'essayais de pousser à nouveau dans le tableau avec soit name: "tom" ou text: "tasty" je ne veux pas qu'il se passe quelque chose... mais si aucun des deux n'est là, je veux que ça se passe... .push()

Comment puis-je le faire ?

11 votes

Utilisez un dictionnaire (hachage/arbre) au lieu d'un tableau.

0 votes

Tout cela est-il disponible en javascript ?

0 votes

126voto

Darin Dimitrov Points 528142

Vous pouvez étendre le prototype Array avec une méthode personnalisée :

// check if an element exists in array using a comparer function
// comparer : function(currentElement)
Array.prototype.inArray = function(comparer) { 
    for(var i=0; i < this.length; i++) { 
        if(comparer(this[i])) return true; 
    }
    return false; 
}; 

// adds an element to the array if it does not already exist using a comparer 
// function
Array.prototype.pushIfNotExist = function(element, comparer) { 
    if (!this.inArray(comparer)) {
        this.push(element);
    }
}; 

var array = [{ name: "tom", text: "tasty" }];
var element = { name: "tom", text: "tasty" };
array.pushIfNotExist(element, function(e) { 
    return e.name === element.name && e.text === element.text; 
});

5 votes

Je pense que votre comparateur devrait prendre deux arguments, cela simplifierait le cas où la valeur ajoutée est en ligne et non dans une variable à laquelle vous pouvez accéder dans votre fonction. array.pushIfNotExist({nom : "tom", text : "tasty" }, function(a,b){ return a.name === b.name && a.text === b.text ; }) ;

37 votes

Je me demande pourquoi ce n'est pas natif au langage - peu importe comment c'est implémenté - l'idée de "ajouter seulement si c'est unique" est si fondamentale qu'elle est supposée exister.

12 votes

Il est préférable d'étendre le prototype Array avec la méthode JavaScript 1.6 IndexOf au lieu de votre inArray.

43voto

MistereeDevlord Points 278

http://api.jquery.com/jQuery.unique/

var cleanArray = $.unique(clutteredArray);

makeArray pourrait également vous intéresser

L'exemple précédent est le meilleur en disant qu'il faut vérifier s'il existe avant de le pousser. Avec le recul, je constate qu'il est également indiqué que vous pouvez le déclarer comme faisant partie du prototype (je suppose que c'est une extension de classe), donc pas de grande amélioration ci-dessous.

Sauf que je ne suis pas sûr que indexOf soit un chemin plus rapide que inArray ? probablement.

Array.prototype.pushUnique = function (item){
    if(this.indexOf(item) == -1) {
    //if(jQuery.inArray(item, this) == -1) {
        this.push(item);
        return true;
    }
    return false;
}

22 votes

Depuis le lien jQuery : Note that this only works on arrays of DOM elements, not strings or numbers. De plus, indexOf ne fonctionne pas dans IE8 :(

0 votes

Vous pouvez utiliser lodash _.indexOf, cela fonctionnera dans IE8.

26voto

Ronen Rabinovici Points 413

Utilisez une bibliothèque js comme underscore.js pour ces raisons exactement. Utilisation : union : Calcule l'union des tableaux passés : la liste des éléments uniques, dans l'ordre, qui sont présents dans un ou plusieurs des tableaux.

_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]);
=> [1, 2, 3, 101, 10]

8 votes

Notez que cela renvoie un nouveau tableau et ne pousse pas réellement vers un tableau existant.

4 votes

Je pense qu'il n'est pas nécessaire d'introduire un cadre pour tester quelque chose d'aussi simple.

1voto

Thomas Eding Points 8651

Utilisez un dictionnaire (hachage/arbre) au lieu d'un tableau.

-2voto

jgroenen Points 954

Vous pouvez utiliser jQuery grep et pousser si aucun résultat : http://api.jquery.com/jQuery.grep/

Il s'agit essentiellement de la même solution que dans la solution "extension du prototype", mais sans étendre (ou polluer) le prototype.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X