Comment puis-je pousser dans un tableau si aucune valeur 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'ai essayé de pousser à nouveau dans le tableau avec l'un name: "tom"
ou l' autre text: "tasty"
, je ne veux pas qu'il se passe quoi que ce soit ... mais si aucun d'eux n'est là, alors je veux que cela se produise.push()
Comment puis-je faire ceci?
javascript
arrays
json
push
not-exists
tarnfeld
la source
la source
Réponses:
Vous pouvez étendre le prototype Array avec une méthode personnalisée:
la source
Array.findIndex()
est une fonction JS intégrée qui réalisera la même chose que votre code.Pour un tableau de chaînes (mais pas un tableau d'objets), vous pouvez vérifier si un élément existe en appelant
.indexOf()
et s'il ne le fait pas simplement pousser l'élément dans le tableau:la source
if (a.indexOf({ name: "tom", text: "tasty" })!=-1) a.push({ name: "tom", text: "tasty" })
deux fois. Il ajoutera un objet «similaire» deux fois.C'est assez facile à faire en utilisant la
Array.findIndex
fonction, qui prend une fonction comme argument:la source
http://api.jquery.com/jQuery.unique/
vous pourriez également être intéressé par makeArray
L'exemple précédent est préférable de dire que vérifier s'il existe avant de pousser. Avec le recul, il indique également que vous pouvez le déclarer comme faisant partie du prototype (je suppose que c'est alias Extension de classe), donc pas de grande amélioration ci-dessous.
Sauf que je ne sais pas si indexOf est un itinéraire plus rapide que inArray? Probablement.
la source
Note that this only works on arrays of DOM elements, not strings or numbers.
En outre, indexOf ne fonctionne pas dans IE8 :(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.
la source
Comme ça?
Avec objet
la source
array.find
est une mauvaise idée car il recherche l'ensemble du tableau. UtilisezfindIndex
, qui recherche uniquement jusqu'à la première occurrence.Je sais que c'est une très vieille question, mais si vous utilisez ES6, vous pouvez utiliser une toute petite version:
Très facile, ajoutez d'abord un filtre qui supprime l'élément - s'il existe déjà, puis ajoutez-le via un concat.
Voici un exemple plus réaliste:
Si votre tableau contient des objets, vous pouvez adapter la fonction de filtre comme ceci:
la source
Poussez dynamiquement
En méthode simple
Si le tableau contient uniquement des types primitifs / tableau simple
la source
Je vous suggère d'utiliser un ensemble ,
Les ensembles n'autorisent que des entrées uniques, ce qui résout automatiquement votre problème.
Les ensembles peuvent être déclarés comme suit:
la source
Array.push
,Set.add
est donc l'équivalent de cela.Code facile, si 'indexOf' renvoie '-1' cela signifie que l'élément n'est pas à l'intérieur du tableau alors la condition '=== -1' récupère vrai / faux.
L'opérateur '&&' signifie 'et', donc si la première condition est vraie, nous la poussons vers le tableau.
la source
Pas sûr de la vitesse, mais
stringification
+indexOf
est une approche simple. Commencez par transformer votre tableau en chaîne:Ensuite, pour une série de paires attribut-valeur, vous pouvez utiliser:
Trouver un objet entier est plus simple:
la source
Au cas où vous auriez besoin de quelque chose de simple sans vouloir étendre le prototype Array:
la source
Dans le cas où quelqu'un a des exigences moins compliquées, voici mon adaptation de la réponse pour un simple tableau de chaînes:
Mise à jour: IndexOf et trim remplacés par des alternatives jQuery pour la compatibilité IE8
la source
J'ai utilisé mapper et réduire pour le faire dans le cas où vous souhaitez rechercher par la propriété spécifique d'un objet, utile car faire l'égalité directe d'objet échouera souvent.
la source
Petit exemple:
la source
a est le tableau d'objets que vous avez
la source
Vous pouvez utiliser la méthode findIndex avec une fonction de rappel et son paramètre "this".
Remarque: les anciens navigateurs ne connaissent pas findIndex mais un polyfill est disponible.
Exemple de code (veillez à ce que dans la question d'origine, un nouvel objet ne soit poussé que si aucune de ses données ne se trouve dans des objets poussés précédemment):
la source
Je suppose que je suis trop tard pour répondre ici, mais c'est ce que j'ai finalement trouvé pour un gestionnaire de messagerie que j'ai écrit. Des œuvres, c'est tout ce dont j'ai besoin.
la source
Cela fonctionne pour une comparaison d'objets. Dans certains cas, vous pourriez avoir beaucoup de champs à comparer. Bouclez simplement le tableau et appelez cette fonction avec un élément existant et un nouvel élément.
la source
Ici, vous avez un moyen de le faire en une seule ligne pour deux tableaux:
la source
Vous pouvez utiliser jQuery grep et pousser si aucun résultat: http://api.jquery.com/jQuery.grep/
C'est fondamentalement la même solution que dans la solution "étendre le prototype", mais sans étendre (ni polluer) le prototype.
la source
Vous pouvez vérifier le tableau à l'aide de foreach, puis faire apparaître l'élément s'il existe, sinon ajouter un nouvel élément ...
les exemples newItemValue et submitFields sont des paires clé / valeur
la source