2015-12-22 6 views
8

Ich kann keine definitive Antwort dafür finden. Beachten Sie Folgendes:jQuery wie sieht man in jedem()?

var dupe = false; 
    $(".syndUID").sort(function(a,b) { 
     return a - b; 
    }).each(function(i, el) { 
     alert($(this).val() + " - " + $(this).next().val()); 
     if($(this).val() == $(this).next().val()) { 
       dupe = true; 
       return; 
     }; 
    }); 

Dieser Code ist ein Versuch, doppelte Werte in einem Satz von Eingängen mit der Klasse syndUID zu finden. Sie sind über eine Form verstreut, also nicht nebeneinander im DOM.

next().val() ist jedoch immer undefiniert. verwende ich die falsche Funktion? Wie gucke ich einfach zum nächsten Element? Ich habe Zugriff auf den Index, aber ich weiß nicht, wie ich ihn überhaupt nutzen soll.

EDIT:

Nach dem Lesen der Kommentare und Antworten, die ich dort wirklich realisiert ist keine richtige Iterator in jQuery, die mir wirklich dumm scheint, da es jeder sieht(). Ich hatte auch einen anderen Fehler mit dem obigen Code. Hier ist die endgültige Lösung, die ich verwendet, das funktioniert:

// duplicate check 
    var dupe = false; 
    var prevVal = undefined; 
    $(".syndUID").sort(function(a,b) { 
     return $(a).val() - $(b).val(); 
    }).each(function() { 
     if($(this).val() == prevVal) { 
      dupe = true; 
      return false; 
     } 
     prevVal = $(this).val(); 
    }); 

Für jeden, der dies über Google findet, die von anderen bereitgestellt Antworten kann eine annehmbare Alternative sein, aber für meine Bedürfnisse fand ich dies genügte.

+3

'next()' wird das nächste Geschwisterelement erhalten, nicht unbedingt das nächste Element in der übereinstimmenden Menge. –

+0

So kommen wir zu dieser Frage: http://stackoverflow.com/questions/3670136/jquery-find-next-element-by-class. – nicael

+1

Sie möchten nur wissen, ob es doppelte Werte gibt? Zumindest deutet das auf den Code hin (für mich) – Andreas

Antwort

3

Sie können so etwas wie $('.syndUID')[i+1] tun, um die Liste regrab, auf dieses Element konzentriert (und es gegebenenfalls wieder in ein jQuery-Objekt drehen)

[i+1] Verwendung wird ein DOM-Element zurück, aber Sie können .eq(i+1) verwenden eine Rückkehr jQuery-Objekt. Oder, wenn Sie Ihre zukünftigen Entwickler hassen, wickeln Sie das DOM-Element in $(), weil Schraubenlesbarkeit!

Wie Andreas sagte - Regrabbing der Liste verschwendet Speicher. Vor der Schleife cache das Objekt in eine Variable mit var element = $('.syndUID'), so dass du das DOM nicht so oft wiederholst.

+0

Also für jedes Element in '$ ('. SyndUID')' Sie werden alle Elemente mit der Klasse 'syndUID' wieder holen? O.o 'var Elemente = $ ('. SyndUID'); elements.each (function (i, el)) {var nextElement = elements.eq (i + 1); ...} ' – Andreas

+0

@Andreas editiert. Das ist ein guter Punkt. –

+1

Das ist ein bisschen eine klobige Methode, um weiter zu greifen gleiche Liste.Setzen Sie es auf eine Variable, und wenden Sie dann die Indizierung auf die Variable, so dass Sie die Liste zwischengespeichert halten - Hinzufügen oder Entfernen von der Liste nach Bedarf. – Korgrue

-3

Vielleicht verwenden Sie eine Standard for Schleife, wie ich oben habe. Auf diese Weise haben Sie einen Index (i), um auf jedes beliebige Element zu verweisen.

-1

next() packt das nächste Geschwister - nicht der nächste Vorfahre oder Elternteil.

Zum Beispiel, wenn wir eine ungeordnete Liste, next() funktioniert wie folgt:

var a = $('#listone.first').next().val(); 
console.log(a) //outputs "Second" 

<ul id="listone"> 
<li class="first">First</li> 
<li class="second">Second</li> 
</ul> 
<ul id="listtwo"> 
<li class="third">Third</li> 
<li class="fourth">Forth</li> 
</ul> 

Also, wenn Sie den nächsten Elternteil zu greifen versuchen, .val(), die auf .NEXT() werde nicht arbeiten. Ich weiß nicht, was Sie ausgeben (Tabelle, UL, DIV, usw.), so dass es schwierig ist, Ihnen eine funktionierende Lösung zu geben - aber das ist wahrscheinlich Ihr Problem. Sie durchlaufen das DOM nicht ordnungsgemäß.

+0

Eine gültige Beobachtung, aber dies beantwortet nicht wirklich die Frage. – j08691

+0

Ja Ich weiß, dass ich die Struktur dessen, woran er/sie Werte zu sammeln versucht, kennen muss, damit ich meine Antwort mit einer Lösung für sein Problem bearbeiten kann.Ich zeige nur das Problem mit seinem Ansatz, Elemente zu greifen Dies sollte wahrscheinlich ein Kommentar sein, keine Antwort – Korgrue

-1

Nun, Sie haben Ihre sortierte Array bereits, vielleicht anstatt dies mit .each() zu tun, verwenden Sie einfach eine einfache for Schleife?

var elemArray = $(".syndUID").sort(function(a,b) { 
    return a - b; 
}); 

for(var i = 0; i < elemArray.length; i++){ 
    if(elemeArray[i].value == elemArray[i+1].value){ 
     //do something with comparison 
    } 
} 

Dies wird jedoch nur ein Duplikat überprüft im nächsten syndUID Elemente im Array. Um eine vollständige Suche durchzuführen, müssen Sie jedes Element auf jedes Element (ohne sich selbst) aus dem Array überprüfen.Das würde eine verschachtelte Schleife beinhalten, die Ihrer Funktion eine Reihenfolge von n^2 hinzufügt.

+0

Ich habe genau das geschrieben, außer dass du (aus irgendeinem Grund) den Alarm, den OP gesetzt hat, ausgelassen hast. Du setzt nicht einmal die "dupe" -Flagge. –

+0

@ JᴀʏMᴇᴇ Das s Es ist nicht so, Code komplett neu zu schreiben. Ich versuche nur, das OP in die richtige Richtung zu lenken. – Adjit