2010-03-10 16 views
7

Tengo una mesa. Algunas filas se agregan dinámicamente por jquery.Usando jquery, ¿cómo puedo verificar que una colección de elementos de entrada tenga valores únicos?

La primera <td> de cada fila tiene un elemento <input type="text" />. Usando jQuery, ¿es posible verificar que todos estos elementos de entrada tengan valores únicos?

+0

No, su inglés es simplemente meh. – hobodave

+0

@hobodave: Gracias. Lo sé, pero a veces, ¿qué puedo hacer? Lo estoy intentando. :) – loviji

+0

No estoy criticando, solo estoy explicando. – hobodave

Respuesta

6

La solución de Nick tiene O (n) complejidad. Aquí hay un ejemplo optimizado.

La función isUnique determina el resultado requerido.

<script src="jquery.js" /> 
<script> 
function isUnique(tableSelector) { 
    // Collect all values in an array 
    var values = [] ; 
    $(tableSelector + ' td:first-child input[type="text"]').each(function(idx,val){ values.push($(val).val()); }); 

    // Sort it 
    values.sort() ; 

    // Check whether there are two equal values next to each other 
    for(var k = 1; k < values.length; ++k) { 
     if(values[k] == values[k-1]) return false ; 
    } 
    return true ; 
} 

// Test it 
$(document).ready(function(){ 
    alert(isUnique(".myTable")) ; 
}); 
</script> 

<table class="myTable"> 
    <tr><td><input type="text" value="1" /></td></tr> 
    <tr><td><input type="text" value="2" /></td></tr> 
</table> 
+1

Esto recorre la matriz 3 veces más un orden ... la diferencia de rendimiento tomaría cientos de miles de bucles para hacer 1ms, todo este tiempo se gasta en el selector en este caso. Para cosas como esta, tomaré un código más directo que las mejoras de .000001ms en tiempo de ejecución cualquier día de la semana :) –

+0

Consideraría tener dos opciones, una para cada escenario posible (por supuesto, su solución funciona mucho mejor) para una matriz larga con valores iguales al principio; la mía será más rápida, si es que al final). Además, hay idealistas, que viven para producir un mejor código;) –

+0

De acuerdo, depende de dónde estén los duplicados ... Supongo que no tengo el hábito de hacer páginas lo suficientemente grandes como para que el rendimiento tenga más de un .0000001ms de diferencia, así que opto por el enfoque de código más limpio ... o más bien lo que me parece más limpio. –

4

Usted puede utilizar una matriz para esto y la jQuery .inArray function así:

var vals = new Array(); 
$("td:first-child input").each(function() { 
    if($.inArray($(this).val(), vals) == -1) { //Not found 
    vals.push($(this).val()); 
    } else { 
    alert("Duplicate found: " + $(this).val()); 
    }  
}); 

asegúrese de borrar vals antes de una segunda pasada si está volver a usarlo.

Cuestiones relacionadas