JavaScript if problem

striker159

Lt. Junior Grade
Registriert
Dez. 2008
Beiträge
333
hallo
ich habe eine tabelle mit logindaten, also datum,uhrzeit,ip
die sieht zb so aus

06-01 06:00:00: ip1
06-01 09:00:00: ip2
06-01 12:00:00: ip2
06-01 15:00:00: ip1

diese zeilen stehen in einem array namens 'logins'.
jetzt möchte ich, dass, wenn sich hintereinder mit der selben ip eingeloggt wird, der letzte eintrag mit der selben ip gelöscht wird. in dem beispiel soll es dann letztendlich so aussehen :

06-01 06:00:00: ip1
06-01 09:00:00: ip2
06-01 15:00:00: ip1

hier mein code dafür
Code:
var ips = new Array();
    for (var i=0;i<logins.length;i++){
      ips[i] = logins[i].match(/\d+\.\d+\.\d+\.\d+/);
    }
    for (var i=0;i<logins.length-1;i++){
      if(ips[i]==ips[i+1]){
        logins.concat(logins.slice(0,i+1),logins.slice(i+2,logins.length)); 
      }       
    }

meiner meinung nach sollte der code funktionieren. allerdings wird die if-anweisung nicht ausgeführt , obwohl die 2 werte gleich sind. also wenn ips[1] ip2 ist, und ips[2] auch ip2 ist.

was ist falsch?
 
In der 2ten Schleife verändert du während(!) dem Schleifendurchlauf deine Schleifenvariable logins.length implizit durch die Methode logins.concat. Das ist böse!

Mach doch ein extra array loginsClean und kopier' in das nur Einträge mit neuer IP. Da kannst du dir auch den extra Schleifenlauf mit ips sparen.
Irgendwie sowas ähnliches:
Code:
    var loginsClean = new Array();
    var j = 0;
    for (var i=0; i < logins.length; i++){
      if (loginsClean[j].match(/\d+\.\d+\.\d+\.\d+/) != logins[i].match(/\d+\.\d+\.\d+\.\d+/)){
        loginsClean[j] = logins[i];
        j++;
      }
    }
 
dankeschön.
ja, dass das mit der schleifenvariable ändern nicht klappen wird, dachte ich mir schon. nur ich kam nie so weit :)

aber irgendwie klappt das nicht >_<
Code:
    var loginsclean = new Array();
    loginsclean[0] = logins[0];
    var j = 0;
    for (var i=1; i < logins.length-1; i++){
      alert('XXX'+loginsclean[j].match(/\d+\.\d+\.\d+\.\d+/)+'XXX');
      alert('XXX'+logins[i].match(/\d+\.\d+\.\d+\.\d+/)+'XXX');
      if (loginsclean[j].match(/\d+\.\d+\.\d+\.\d+/) != logins[i].match(/\d+\.\d+\.\d+\.\d+/)){
alert('ungleich');
        loginsclean[j+1] = logins[i];
        j++;
      }
    }

die 2 alerts geben je ip2 aus, aber trotzdem wird ungleich angezeigt und folglich der eintrag hinzugefügt -.-
 
Zuletzt bearbeitet:
Naja das .match ist hier eigentlich auch nicht das richtige für'n Stringvergleich. Viel zu fehlerträchtig.
Besser sowas, da wird nur der Endstring verglichen:
Code:
var vorherIPString = loginClean[j].substring(loginClean[j].lastIndexOf(":" + 2));
var nachher = logins[i].substring(logins[i].lastIndexOf(":" + 2));
if (vorherIPString != nachher){
  ....
}
(bin mir jetzt aber nicht sicher, ob das mit +2 im .substring(...) passt)
Siehe:
http://de.selfhtml.org/javascript/objekte/string.htm#last_index_of
http://de.selfhtml.org/javascript/objekte/string.htm#substring

p.s.: Deine Schleufe geht nur bis logins.length-1
Damit wird das letzte Element der ursprünglichen logins[] nicht mehr überprüft.
 
Zuletzt bearbeitet:
nochmals danke für deine bemühungen. ich habe es aber jetzt auch mit match geschaft:
anstelle von
Code:
match(/\d+\.\d+\.\d+\.\d+/)
habe ich
Code:
match(/\d+\.\d+\.\d+\.\d+/)[0]
verwendet.

deine variante werde ich aber auch noch umsetzen, da regExp nicht so schnell sein sollen.
 
Zurück
Oben