2012-10-04 22 views
8

Duplicar posible:
Easiest way to find duplicate values in a JavaScript array¿Cómo buscar a través de una matriz en Javascript?

Estoy buscando para encontrar si dos valores son los mismos en una matriz. He escrito el siguiente código:

function validatePassTimeFields(passtimes) { 
    var success = true; 
    var length = passtimes.length; 
    var hashMap = new Object(); 
    for (var j=0; j<length; j++) { 
     if(hashMap[passtimes[j].value]==1) { 
      success = false; 
      alert("Duplicate Found"); 
      break; 
     } 
     hashMap[passtimes[j].value]=1; 
    } 
    return success; 
} 

Soy nuevo en Javascript, por lo que ha intentado usar HashMap gustaría encontrar si hay alguna duplicado. ¿Es la mejor forma de encontrar un duplicado en JavaScript? o puedo optimizarlo?

+0

qué quiere "encontrar" duplicados o "eliminar" a ellos? –

+1

Vea si alguna de estas soluciones ayuda: http://stackoverflow.com/questions/840781/easiest-way-to-find-duplicate-values-in-a-javascript-array – Chase

+0

@JarrodRoberson Solo quiero encontrarlas. Y si solo hay uno de ellos es suficiente para mí. – sheidaei

Respuesta

1

Su función ya es muy bueno, aparte de la cuestión que sólo funciona para las matrices con cadenas o números. Para un enfoque más difícil para la atención también sobre objetos, vea this answer. No creo que eso sea importante para usted, ya que tiene un caso de uso explícito y restringido (verificar la identidad en la propiedad value).

Sin embargo, algunos puntos que me gustaría hacer diferente:

  • No utilice la variable success y break del bucle, pero sólo return de toda la función.
  • En lugar del constructor new Object generalmente el objeto de acceso directo literal {} se utiliza
  • En lugar de establecer los valores de la hashMap-1 uno podría utilizar true; también puede omitir el operador de igualdad == y simplemente verificar la veracidad de la propiedad. Incluso usaría el in operator.
function validatePassTimeFields(passtimes) { 
    var length = passtimes.length; 
    var hashMap = {}; 
    for (var j=0; j<length; j++) { 
     if (passtimes[j].value in hashMap) { 
      alert("Duplicate Found"); 
      return false; 
     } 
     hashMap[passtimes[j].value] = 1; 
    } 
    return true; 
} 
0

Parece que no quiere encontrar los duplicados, solo para ver si hay alguno?

Estás muy cerca, aquí hay una función de trabajo;

var hasDuplicates = function (arr) { 

    var _store = {}; 

    for (var i = 0; i < arr.length; i++) { 

     if (typeof _store["_" + arr[i]] !== "undefined") { 
      return true; 
     } 

     _store["_" + arr[i]] = true; 

    } 

    return false; 

}; 

Los subrayados en la matriz asociativa son necesarios para almacenar valores numéricos. La función hasDuplicates() solo funciona con objetos que tienen un método toString().

Para verificar si hay duplicados;

var yourArray = [1, 5, 7, 3, 5, 6]; 

if (hasDuplicates(yourArray)) {... 
+0

Gran solución. Claro y simple. –

+1

¿Por qué usa tantos caracteres de subrayado? – Bergi

+0

@Bergi - Estoy como "marcando" las variables como privadas para el alcance. De esta forma, es más fácil no mezclarlos con variables en el ámbito externo. –

0

Puede valer la pena revisar la implementación de esta funcionalidad por parte de underscore. Si solo busca eliminar a los engañados, puede usar _.uniq(), pero si está más interesado en saber que hay engaños o detalles de la implementación pura, puede disfrutar revisando el source of this method, que está muy bien documentado.

Sé que esto no es una respuesta de código directo a la pregunta, ya hay algunas aquí, por lo que no sería útil repetir. Pero pensé que valía la pena mencionarlo ya que el guión bajo es una gran biblioteca de utilidades y la fuente es un gran lugar para aprender más sobre el Javascript bien escrito.

1

// Sólo se necesitaría para optimizarlo si desea utilizarlo en otro lugar-

function noduplicates(array){ 
    var next, O= {}, 
    L= array.length; 
    while(L){ 
     next= array[--L]; 
     if(O[next]) return false; 
     O[next]= 1; 
    } 
    return true; 
} 


function validatePassTimeFields(passtimes){ 
    if (noduplicates(passtimes)) return true; 

    alert("Duplicate Found"); 
    return false; 
} 
+0

Estoy probando su código http://jsfiddle.net/GubnU/ y funciona bien. Sin embargo, cuando lo estoy ejecutando localmente, tengo que cambiar la línea donde asigna el siguiente valor a lo siguiente: next = array [- L] .value; ¿Alguna idea de por qué? – sheidaei

Cuestiones relacionadas