2017-03-03 68 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