代码如下: function isLinkExist(owners,name){ owners.forEach(function(owner) { if (owner.name == name) { return true; } }); return false; }
运行结果发现返回值都是false,请问我该如何修改代码
function isLinkExist(owners,name){
var mark = false;
owners.forEach(function(owner) {
if (owner.name == name) {
mark = true;
}
});
return mark;
}
可以用 Array.prototype.every
或者 Array.prototype.some
function isLinkExist(owners,name){
return owners.every(owner=>owner.name === name)
}
@cnwhy 谢谢,测试成功。 我感觉是由于forEach内部代码是异步的,导致我的代码不正确,但是对此的认识还是很模糊,能帮忙讲解一下吗?
forEach 不是异步的。
你的问题在于第一个 return true 写在了 forEach 的调用函数中,并不是 isLinkExist
的 return。这个 isLinkExist
真正的 return 只有一个 false,所以无论函数里做了什么,最终都只会 return false。
你的代码:
function isLinkExist(owners,name) {
owners.forEach(function(owner) {
if (owner.name == name) {
return true; // 这个return 是 forEach 调用函数
}
});
return false; // isLinkExist 真正的返回值只有一个,恒为 false
}
这个实现最好的选择是 Array.prototype.some()
,因为不需要遍历 owners
中的所有元素,只需要找到一个为 true
的就立即返回 true
,否则返回 false
:
function isLinkExist(owners, name) {
return owners.some(function(owner) {
return owner.name === name;
});
}
更简单的 ES2015 写法:
function isLinkExist(owners, name) {
return owners.some(owner => owner.name === name);
}
如果你不想用 .some()
也可以。
.forEach()
function isLinkExist(owners, name) {
let ifExists = false;
owners.forEach(owner => {
if(ifExists) return;
if(owner.name === name) ifExists = true;
});
return ifExists;
}
.every()
function isLinkExist(owners, name) {
return !owners.every(owner => owner.name != name);
}
.filter()
function isLinkExist(owners, name) {
let found = [];
found = owners.filter(owner => owner.name === name);
return (found.length > 0) ? true : false;
}
@nodejsnewbie 如果只是想看看元素是不是存在,不需要遍历所有的元素,二楼的Array.prototype.some是正解。Array.prototype.every和一楼的都不太合适吧。
Some 是OK的。every 确实不太合适吧