2012-03-10 9 views
7

Necesito comprobar si cada elemento de una matriz es idéntico entre sí. Por ejemplo:Compruebe si cada elemento de una matriz es idéntico en javascript

var list = ["l","r","b"]

debe evaluar como falso, ya que cada elemento no es idéntica. Por otro lado esto:

var list = ["b", "b", "b"]

debe evaluar como verdadero, ya que son todos idénticos. ¿Cuál sería la forma más eficiente (en velocidad/recursos) de lograr esto?

Respuesta

9
function identical(array) { 
    for(var i = 0; i < array.length - 1; i++) { 
     if(array[i] !== array[i+1]) { 
      return false; 
     } 
    } 
    return true; 
} 
+1

Opté por esta solución, gracias. Pimvdb tenía una solución muy elegante con array.every pero eso requeriría agregar una gran porción de código (para compatibilidad con el navegador que no sea compatible con ES5) a un documento ya de por sí grande para una instancia de .every así que opté por esto en su lugar. – Nick

+0

Su solución tiene más sentido para mí. Sin embargo, cambiaría "! =" Por "! ==" porque su solución devuelve true en la siguiente matriz [1,1,1,1,1,1, "1"] donde el último carácter es una cadena . –

+0

@JoffreyBaratheon tienes razón, arreglado, gracias! – Dogbert

2
function matchList(list) { 
    var listItem = list[0]; 

    for (index in list) { 
    if(list[index] != listItem { 
     return false; 
    } 
    } 

    return true; 
} 
+1

se producirá un error en el último elemento de la matriz. –

+0

Sí, lo noté. – Jivings

+1

Editado para funcionar ahora. – Jivings

12

En ES5, que podría hacer:

arr.every(function(v, i, a) { 
    // first item: nothing to compare with (and, single element arrays should return true) 
    // otherwise: compare current value to previous value 
    return i === 0 || v === a[i - 1]; 
}); 

.every hace cortocircuito así.

+1

Bien, no sabía que esto existía y voy a empezar a usar esto yo mismo. Solo agregue un puntero a los documentos para array.every https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every – Shane

+0

Gracias, esa es una solución muy elegante. Opté por la solución de Dogberts al final para evitar agregar la matriz. Todos los códigos eran compatibles con navegadores antiguos, pero en principio esto habría funcionado bien. – Nick

1
var list = ["b", "b", "b"]; 
var checkItem = list[0]; 
var isSame = true; 
for (var i = 0; i < list.length; i++) { 
    if (list[i] != checkItem) { 
    isSame = false; 
    break; 
    } 
} 
return isSame; 
+0

Simplemente devuelve falso cuando lo encuentras por primera vez. – Jivings

+0

Sí, no estaba seguro de si el OP lo quería para usarlo más tarde o devolverlo en una función. –

0

Mi sugerencia sería eliminar duplicados (echa un vistazo a Easiest way to find duplicate values in a JavaScript array), y después comprobar para ver si la longitud == 1. Eso significaría que todos los elementos son los mismos.

+2

Eso sería O (n^2) (o O (n log n) dependiendo del algoritmo de clasificación). Demasiado lento. – Dogbert

+0

En realidad, yo estaba sugiriendo la segunda respuesta (debería haber especificado), que eliminar duplicados sin ordenar. –

0
function allEqual(list) 
{ 
    if(list.length == 0 || list.length == 1) 
    { 
     return true; 
    } 

    for (index in list) { 
    if(list[index] != list[index+1] { 
     return false; 
    } 
    } 

    return true; 

} 
+1

Me gusta mi primera respuesta: fallará en el último elemento de la matriz. – Jivings

Cuestiones relacionadas