2010-03-10 4 views
7

Ich habe eine Tabelle. Einige Zeilen werden von jquery dynamisch hinzugefügt.Wie kann ich mit jquery prüfen, ob eine Sammlung von Eingabeelementen eindeutige Werte hat?

Die erste <td> jeder Zeile hat ein <input type="text" /> Element. Kann mit jQuery überprüft werden, ob alle diese Eingabeelemente eindeutige Werte haben?

+0

Nein, Ihr Englisch ist nur meh. – hobodave

+0

@hobodave: Danke. Ich weiß, aber manchmal was kann ich tun? Ich versuche. :) – loviji

+0

Ich kritisiere nicht, nur zu erklären. – hobodave

Antwort

6

Nicks Lösung hat O (n) Komplexität. Hier ist ein optimiertes Beispiel.

Funktion isUnique bestimmt das erforderliche Ergebnis.

<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

Dies durchläuft das Array 3 mal plus eine Sortierung ... der Leistungsunterschied würde hunderttausend Schleifen zu 1ms machen, alle Ihre Zeit wird in diesem Fall in den Selektor verbracht. Für Dinge wie diese nehme ich einfacheren Code als .000001ms Verbesserungen in der Ausführungszeit an jedem Tag der Woche :) –

+0

Ich würde zwei Optionen in Betracht ziehen, eine für jedes mögliche Szenario (natürlich funktioniert Ihre Lösung viel besser für ein langes Array mit gleichen Werten am Anfang, meins wird schneller, wenn sie am Ende sind). Außerdem gibt es Idealisten, die leben, um einen besser aussehenden Code zu produzieren;) –

+0

Einverstanden, hängt davon ab, wo die Duplikate sind ... Ich nehme an, ich bin nicht in der Gewohnheit, Seiten groß genug zu machen, dass die Leistung mehr als eine haben würde .0000001ms Unterschied, also entscheide ich mich für den saubersten Code-Ansatz ... oder eher, was mir am saubersten erscheint. –

4

Sie können ein Array für diese und die jQuery .inArray function wie folgt verwenden:

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()); 
    }  
}); 

Seien Sie sicher, vals vor einem zweiten Durchgang zu löschen, wenn Sie es sind die Wiederverwendung.

Verwandte Themen