J'ai besoin de trouver des tableaux où toutes les valeurs sont égales. Quel est le moyen le plus rapide de faire cela? Dois-je le parcourir et comparer simplement les valeurs?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
la source
la source
a.join(',').split(a[0]).length === a.length + 1
Réponses:
Ou one-liner:
Array.prototype.every (de MDN): la
every()
méthode teste si tous les éléments du tableau passent le test implémenté par la fonction fournie.la source
const everythings_equal = array => array.every(thing => thing === array[0]);
some
lieu deevery
:arr.some( v => v !== arr[0] )
. Cela reviendra tôt lorsque le premier élément trouvé est différent dearr[0]
.every
fait également un retour anticipé.Edit: Soyez un ninja rouge:
Résultats:
Avertissement:
C'est parce que nous ne transmettons pas une valeur initiale . Donc, vous voudrez peut-être vérifier d'
array.length
abord.la source
false
s! par exemple try [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
retournetrue
: /NaN
. Puisque les deuxNaN === NaN
etNaN !== NaN
sont faux, cela garantit qu'une fois que leprev
est défini sur NaN, aucune valeur ne peut le supprimer. L'ajout d'une double négation convertit également les résultats entrue
etfalse
, puisqueNaN
c'est faux. Forme finale:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Cela marche. Vous créez une méthode sur Array à l'aide de prototype.
Appelez cela de cette façon:
la source
Array.prototype
très bien (même IE6). Ce ne sont que des prototypes d'éléments DOM que certaines anciennes versions d'IE ne prennent pas en charge l'augmentation.allValuesSame
dans la boucleDans JavaScript 1.6, vous pouvez utiliser
Array.every
:Vous avez probablement besoin de quelques vérifications de cohérence, par exemple lorsque le tableau ne contient aucun élément. (De plus, cela ne fonctionnera pas lorsque tous les éléments sont
NaN
depuisNaN !== NaN
, mais cela ne devrait pas être un problème ... non?)la source
Vous pouvez transformer le tableau en un ensemble. Si la taille de l'ensemble est égale à 1, tous les éléments du tableau sont égaux.
la source
allEqual([NaN, NaN])
donnetrue
dans ce cas.Et pour la comparaison des performances, j'ai également fait un benchmark:
Résultats:
Donc, apparemment, utiliser array.some () intégré est la méthode la plus rapide de celles échantillonnées.
la source
Array#some
performances sont parfois surpassées est qu'une fois que la fonction de rappel retourne true, elle cesse d'itérer. Donc, si tous les éléments sont en fait égaux, les performances doivent être identiques àArray#every
. Et les performances relatives lorsque tous les éléments ne sont pas égaux varient en fonction de l'indice du premier élément non correspondant.Réponse la plus courte en utilisant un trait de soulignement / lodash
spec:
Éditer:
Ou encore plus court, inspiré de la réponse de Tom:
spec:
la source
Si vous utilisez déjà underscore.js , voici une autre option utilisant
_.uniq
:_.uniq
renvoie une version sans doublon du tableau. Si toutes les valeurs sont identiques, la longueur sera 1.Comme mentionné dans les commentaires, étant donné que vous pouvez vous attendre à ce qu'un tableau vide retourne
true
, vous devriez également vérifier ce cas:la source
false
. Alors que je pense que ça devrait l'êtretrue
. Changer en.length <= 1
suffira cependant.Oui, vous pouvez le vérifier également en utilisant le filtre comme ci-dessous, très simple, en vérifiant que toutes les valeurs sont les mêmes que la première:
peut également être fait en utilisant toutes les méthodes du tableau:
et vous pouvez vérifier vos tableaux comme ci-dessous:
Ou vous pouvez l'ajouter aux fonctionnalités natives de Array en JavaScript si vous le réutilisez beaucoup:
et vous pouvez vérifier vos tableaux comme ci-dessous:
la source
Vous pouvez utiliser
Array.every
si pris en charge:L'approche alternative d'une boucle pourrait être quelque chose comme
sort
Ou, si les éléments sont comme la question, quelque chose de sale comme:
Fonctionne aussi.
la source
equals = !array.some( (v,i,a) => v!==a[0] )
. Sinon, vous vérifiez simplement que toute valeur est égale à la première, ce qui sera bien sûr toujours vrai :)some
au lieu deevery
comme je l'ai mentionné dans le premier paragraphe. :) Merci pour la capture!Vous pouvez obtenir ce one-liner pour faire ce que vous voulez en utilisant les fonctions fléchées Array.prototype.every , Object.is et ES6:
la source
Je pense que le moyen le plus simple de le faire est de créer une boucle pour comparer chaque valeur à la suivante. Tant qu'il y a une coupure dans la "chaîne", alors il retournera faux. Si le premier est égal au second, le second égal au troisième et ainsi de suite, alors nous pouvons conclure que tous les éléments du tableau sont égaux les uns aux autres.
étant donné un tableau de données [], alors vous pouvez utiliser:
la source
la source
Mettre à jour une nouvelle solution: vérifier l'index
Mise à jour avec ES6: l'utilisation
list.every
est le moyen le plus rapide:ancienne version:
la source
Vous pouvez utiliser ceci:
La fonction vérifie d'abord si le tableau est vide. Si c'est le cas, ses valeurs sont égales. Sinon, il filtre le tableau et prend tous les éléments qui sont différents du premier. S'il n'y a pas de telles valeurs => le tableau ne contient que des éléments égaux sinon ce n'est pas le cas.
la source
La
_.isEqual(object, other)
fonction de soulignement semble bien fonctionner pour les tableaux. L'ordre des éléments dans le tableau est important lorsqu'il vérifie l'égalité. Voir http://underscorejs.org/#isEqual .la source
la source
C'est simple. Créez une fonction et passez un paramètre. Dans cette fonction, copiez le premier index dans une nouvelle variable. Créez ensuite une boucle for et parcourez le tableau. À l'intérieur d'une boucle, créez une boucle while avec une condition vérifiant si la nouvelle variable créée est égale à tous les éléments de la boucle. si son égal retourne true après la fin de la boucle for else retourne false dans la boucle while.
la source
La réponse acceptée fonctionnait très bien mais je voulais ajouter un tout petit peu. Cela n'a pas fonctionné pour moi
===
parce que je comparais des tableaux de tableaux d'objets, mais tout au long de mon application, j'ai utilisé le package fast-deep-equal que je recommande vivement. Avec cela, mon code ressemble à ceci:et mes données ressemblent à ceci:
la source
Et vous avez terminé!
la source
Vous pouvez maintenant utiliser des ensembles pour le faire facilement.
la source
Vous pouvez utiliser une boucle for:
la source
Eh bien, ce n'est vraiment pas très compliqué. Je soupçonne fortement que vous n'avez même pas essayé. Ce que vous faites est de choisir la première valeur, de l'enregistrer dans la variable, puis, dans une
for
boucle, de comparer toutes les valeurs suivantes avec la première.Je n'ai intentionnellement partagé aucun code. Trouvez comment
for
est utilisé et comment les variables sont comparées.la source
Solution simple d'une ligne, comparez-la simplement à un tableau rempli avec la première entrée.
la source
Une autre façon intéressante d'utiliser la syntaxe de la fonction de flèche ES6:
Et quand vous ne voulez pas réutiliser la variable pour array (x):
L'affiche précédente de l'OMI qui a utilisé array.every (...) a la solution la plus propre.
la source
la source
cela pourrait fonctionner, vous pouvez également utiliser le code de commentaire qui fonctionne également bien avec le scénario donné.
la source
Une autre façon avec une taille délimitée et une liste organisée:
tableau1 = [1,2,3]; tableau2 = [1,2,3];
la source
Vous pouvez convertir un tableau en un ensemble et vérifier sa taille
Dans le cas d'entrées de tableaux primitifs, c'est
number
-à- direstring
:Dans le cas d'un tableau d'objets avec un champ à tester pour l'équivalence, dites
id
:la source
En PHP, il existe une solution très simple, une méthode en une ligne:
(count (array_count_values ($ array)) == 1)
Par exemple :
C'est tout.
la source