2017-03-03 64 views
2

這是我的代碼兩個字符串jQuery中比較不工作

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

我建立一個在線文件管理系統。 name參數是用戶通過文本框提供的名稱,而$(object).text()是當前目錄中文件和文件夾的名稱。這些名字通過exec("ls")命令來。

我需要檢查用戶提供的名稱是否已經存在。所以我比較name與每個文件/文件夾名稱。問題是它沒有發現重複。上面的代碼的結果在下圖中給出

enter image description here

+0

一個建議是不要使用exec。它使你的系統成爲客戶的遊樂場 –

+0

爲什麼'()'圍繞'$(object).text()',你確定需要這個嗎? –

+0

當您從DOM讀取文本時,可能會出現多餘的空白區域。使用'.trim()'清除它們。還要檢查而不是記錄值,記錄它們的長度 – Rajesh

回答

2

return true回到了each回調。這對each(它只關心return false)沒有任何影響,並且沒有做任何事情來設置返回值nameIsDuplicate

你想return false那裏(沒有必要繼續看),並設置一個標誌,以便您nameIsDuplicate可以退貨:

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

然而,該功能可簡單了很多使用Array.prototype.some

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

some爲數組中的每個條目調用其回調函數。如果回調返回一個虛假值,some繼續;如果回調返回真實值,則some停止。 some的返回值是true如果回調的調用返回了真值,則返回值爲false

+0

真實,可以是單線解決方案 –

1

你的函數沒有返回true,因爲你在each環......應該是這樣的:

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

我們可以通過使 回調函數返回false來打破特定迭代中的$ .each()循環。返回非錯誤與for循環中的 continue語句相同;它會立即跳到下一個 迭代。

其他解決方案:

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

另外,只需返回'same'或'!! same'即可。不需要'if..else' – Rajesh