这是我的代码
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
与每个文件/文件夹名称进行比较。问题是它找不到重复项。以上代码的结果如下图所示
答案 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;
}