Necesito encontrar matrices donde todos los valores sean iguales. ¿Cuál es la forma más rápida de hacer esto? ¿Debo recorrerlo y solo comparar valores?
['a', 'a', 'a', 'a'] // true
['a', 'a', 'b', 'a'] // false
javascript
jquery
Marvin3
fuente
fuente
a.join(',').split(a[0]).length === a.length + 1
Respuestas:
O una línea:
Array.prototype.every (de MDN): el
every()
método prueba si todos los elementos de la matriz pasan la prueba implementada por la función proporcionada.fuente
const everythings_equal = array => array.every(thing => thing === array[0]);
some
en lugar deevery
:arr.some( v => v !== arr[0] )
. Esto volverá temprano cuando el primer elemento sea desigualarr[0]
.every
regresa temprano también.Editar: Sé un ninja rojo:
Resultados:
Advertencia:
Esto se debe a que no pasamos un Valor inicial . Por lo tanto, es posible que desee verificar
array.length
primero.fuente
false
s! por ejemplo, pruebe [false, false, false] .reduce (function (a, b) {return (a === b)? a: false;});["false", ""]
regresatrue
: /NaN
. Dado que ambosNaN === NaN
yNaN !== NaN
son falsos, garantiza que una vez queprev
se establece en NaN, ningún valor puede eliminarlo. Además, agregar una doble negación convierte los resultados entrue
yfalse
, dado queNaN
es falso. Forma final:!!array.reduce(function(a, b){ return (a === b) ? a : NaN; });
Esto funciona. Puede crear un método en Array utilizando un prototipo.
Llama a esto de esta manera:
fuente
Array.prototype
multa (incluso IE6). Solo los prototipos de elementos DOM son compatibles con algunas versiones anteriores de IE.allValuesSame
en el bucleEn JavaScript 1.6, puede usar
Array.every
:Probablemente necesite algunas comprobaciones de cordura, por ejemplo, cuando la matriz no tiene elementos. (Además, esto no funcionará cuando todos los elementos lo sean
NaN
desde entoncesNaN !== NaN
, pero eso no debería ser un problema ... ¿verdad?)fuente
Puede convertir la matriz en un conjunto. Si el tamaño del conjunto es igual a 1, entonces todos los elementos de la matriz son iguales.
fuente
allEqual([NaN, NaN])
datrue
en este caso.Y para la comparación de rendimiento también hice un punto de referencia:
Resultados:
Entonces, aparentemente usar builtin array.some () es el método más rápido de los muestreados.
fuente
Array#some
que a veces va a funcionar mejor es que una vez que la función de devolución de llamada devuelve verdadero, deja de iterar. Entonces, si todos los elementos son iguales, el rendimiento debería ser idéntico alArray#every
. Y el rendimiento relativo cuando todos los elementos no son iguales variará según el índice del primer elemento que no coincida.Respuesta más corta usando subrayado / lodash
Especificaciones:
editar:
O incluso más corto, inspirado por la respuesta de Tom:
Especificaciones:
fuente
Si ya está usando underscore.js , entonces aquí hay otra opción usando
_.uniq
:_.uniq
devuelve una versión libre de duplicados de la matriz. Si todos los valores son iguales, entonces la longitud será 1.Como se menciona en los comentarios, dado que puede esperar que regrese una matriz vacía
true
, también debe verificar ese caso:fuente
false
. Si bien creo que debería sertrue
. Sin.length <= 1
embargo, cambiar a será suficiente.Sí, puede verificarlo también usando el filtro como se muestra a continuación, muy simple, verificando que todos los valores sean los mismos que el primero:
También se puede hacer usando todos los métodos de la matriz:
y puede verificar sus matrices como a continuación:
O puede agregarlo a las funcionalidades de matriz nativas en JavaScript si lo reutiliza mucho:
y puede verificar sus matrices como a continuación:
fuente
Puede usar
Array.every
si es compatible:El enfoque alternativo de un bucle podría ser algo así como
sort
O, si los artículos son como la pregunta, algo sucio como:
También funciona
fuente
equals = !array.some( (v,i,a) => v!==a[0] )
. De lo contrario, solo verificará que cualquier valor sea igual al primero, lo que, por supuesto, siempre será cierto :)some
lugar deevery
lo que mencioné en el primer párrafo. :) Gracias por la captura!Puede obtener este one-liner para hacer lo que quiera con las funciones de flecha Array.prototype.every , Object.is y ES6:
fuente
Creo que la forma más sencilla de hacer esto es crear un ciclo para comparar cada valor con el siguiente. Mientras haya una ruptura en la "cadena", entonces devolverá falso. Si el primero es igual al segundo, el segundo igual al tercero y así sucesivamente, entonces podemos concluir que todos los elementos de la matriz son iguales entre sí.
dado un conjunto de datos [], puede usar:
fuente
fuente
Actualizar nueva solución: verificar índice
Actualizado con ES6: el uso
list.every
es la forma más rápida:versión antigua:
fuente
Puedes usar esto:
La función primero verifica si la matriz está vacía. Si es así, sus valores son iguales. De lo contrario, filtra la matriz y toma todos los elementos que son diferentes de la primera. Si no hay tales valores => la matriz contiene solo elementos iguales, de lo contrario no lo hace.
fuente
La
_.isEqual(object, other)
función de subrayado parece funcionar bien para las matrices. El orden de los elementos en la matriz importa cuando verifica la igualdad. Ver http://underscorejs.org/#isEqual .fuente
fuente
Es sencillo. Crea una función y pasa un parámetro. En esa función, copie el primer índice en una nueva variable. Luego, crea un bucle for y recorre la matriz. Dentro de un ciclo, cree un ciclo while con una condición que verifique si la nueva variable creada es igual a todos los elementos en el ciclo. si su retorno igual es verdadero después de que el ciclo for se complete, de lo contrario, devuelve falso dentro del ciclo while.
fuente
La respuesta aceptada funcionó muy bien, pero quería agregar un poco. No funcionó para mí
===
porque estaba comparando matrices de matrices de objetos, sin embargo, a lo largo de mi aplicación, he estado usando el paquete fast-deep-equal que recomiendo encarecidamente. Con eso, mi código se ve así:y mis datos se ven así:
fuente
¡Y estás HECHO!
fuente
Ahora puede utilizar conjuntos para hacerlo fácilmente.
fuente
Podrías usar un bucle for:
fuente
Bueno, esto realmente no es muy complicado. Tengo una fuerte sospecha de que ni siquiera lo intentaste. Lo que debe hacer es elegir el primer valor, guardarlo en la variable y luego, dentro de un
for
ciclo, comparar todos los valores posteriores con el primero.Intencionalmente no compartí ningún código. Encuentre cómo
for
se usa y cómo se comparan las variables.fuente
Solución simple de una línea, simplemente compárela con una matriz llena con la primera entrada.
fuente
Otra forma interesante cuando utiliza la sintaxis de la función de flecha ES6:
Y cuando no desee reutilizar la variable para array (x):
Cartel anterior de la OMI que usaba array.every (...) tiene la solución más limpia.
fuente
fuente
esto podría funcionar, también puede usar el código de comentario que también funciona bien con el escenario dado.
fuente
Otra forma con tamaño delimitado y lista organizada:
matriz1 = [1,2,3]; matriz2 = [1,2,3];
fuente
Puede convertir la matriz en un conjunto y verificar su tamaño
En el caso de entradas de matriz primitivos, es decir
number
,string
:En el caso de una matriz de objetos con algún campo para probar la equivalencia, diga
id
:fuente
En PHP, hay una solución muy simple, un método de una línea:
(count (array_count_values ($ array)) == 1)
Por ejemplo :
Eso es todo.
fuente