2017-03-03 4 views
2

funktioniert Dies ist mein CodeVergleicht zwei Strings in jQuery nicht

function nameIsDuplicate(name){ 
    objects = $("#content").find('p.itemOldName'); 
    $(objects).each(function(i, object){ 
     console.log("*"+($(object).text()).toLowerCase() + "*" + name.toLowerCase()+"*"); 
     if(($(object).text()).toLowerCase() == name.toLowerCase()) 
      return true; 
    }); 
    return false; 
} 

ich eine Online-Datei-Manager-System am Bau. Das Argument name ist ein Name, der vom Benutzer über ein Textfeld angegeben wird, und der Name $(object).text() ist der Name der Dateien und Ordner im aktuellen Verzeichnis. Diese Namen kommen über den Befehl exec("ls").

Ich muss überprüfen, ob der vom Benutzer angegebene Name bereits existiert. Also vergleiche ich die name mit jedem Namen von Dateien/Ordnern. Das Problem ist, dass es keine Duplikate gibt. Das Ergebnis des obigen Codes wird im folgenden Bild gegeben

enter image description here

+0

ein Hinweis ist, dass nicht Exec verwenden. Es macht Ihr System zu einem Spielplatz für Kunden –

+0

Warum die '()' um '$ (object) .text()', sind Sie sicher, dass benötigt wird? –

+0

Wenn Sie Text von DOM lesen, besteht die Möglichkeit von zusätzlichen Leerstellen. Verwenden Sie '.trim()', um sie zu löschen. Um zu überprüfen, anstatt den Wert zu protokollieren, protokollieren Sie auch deren Längen. – Rajesh

Antwort

2

Die return true kehrt aus dem each Rückruf. Das hat keine Auswirkung auf each (es interessiert nur return false) und nichts tun, um den Rückgabewert nameIsDuplicate zu setzen.

Sie wollen return false dort (keine Notwendigkeit der Suche zu halten) und ein Flag setzen, damit Ihre nameIsDuplicate kann es zurückgeben:

function nameIsDuplicate(name){ 
    var duplicate = false; 
    objects = $("#content").find('p.itemOldName'); 
    $(objects).each(function(i, object){ 
     console.log("*"+($(object).text()).toLowerCase() + "*" + name.toLowerCase()+"*"); 
     if(($(object).text()).toLowerCase() == name.toLowerCase()) { 
      duplicate = true; 
      return false; // Stop looping 
     } 
    }); 
    return duplicate; 
} 

jedoch, kann diese Funktion viel einfacher sein Array.prototype.some mit:

function nameIsDuplicate(name){ 
    var objects = $("#content").find('p.itemOldName'); 
    name = name.toLowerCase(); 
    return objects.get().some(function(object) { 
     return $(object).text().toLowerCase() === name; 
    }); 
} 

some ruft seinen Rückruf für jeden Eintrag im Array auf. Wenn der Callback einen falschen Wert zurückgibt, geht some weiter; Wenn der Callback einen truthigen Wert zurückgibt, stoppt some. some der Rückgabewert ist true, wenn ein Aufruf an den Callback einen truthy Wert zurückgegeben, false wenn nicht.

+0

wahr, kann eine Linie Lösung sein –

1

Ihre Funktion nicht true zurückkehrt, weil Sie in each Schleife sind ... sollte wie folgt sein:

function nameIsDuplicate(name){ 
    var same=0; 
    objects = $("#content").find('p.itemOldName'); 
    $(objects).each(function(i, object){ 
     console.log("*"+($(object).text()).toLowerCase() + "*" + name.toLowerCase()+"*"); 
     if(($(object).text()).toLowerCase() == name.toLowerCase()){ 
      same=1; 
      return false;   
     } 
    }); 
    if(same){ 
     return true; 
    }else{ 
     return false; 
    } 
} 

Wir können die $ .each() - Schleife bei einer bestimmten Iteration unterbrechen, indem Sie die Callback-Funktion false zurückgeben. Die Rückgabe von nicht-falsch entspricht einer continue-Anweisung in einer for-Schleife. es wird sofort zur nächsten Iteration übersprungen.

Andere Lösung:

function nameIsDuplicate(name){ 
    return $("#content").find('p.itemOldName').filter(function(){return $(this).text().toLowerCase() === name.toLowerCase();}).length; 
} 
+1

Geben Sie auch einfach 'same' oder' !! same' zurück. Keine Notwendigkeit für "if..else" – Rajesh

Verwandte Themen