在jQuery中比较两个字符串不起作用

时间:2017-03-03 12:23:25

标签: javascript 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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;
    }
}
  

我们可以在特定的迭代中打破$ .each()循环   回调函数返回false。返回非假是与a相同   在for循环中继续声明;它将立即跳到下一个   迭代。

其他解决方案:

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