请教一个javascript的编程问题
发布于 8 年前 作者 nodejsnewbie 3794 次浏览 来自 问答

代码如下: function isLinkExist(owners,name){ owners.forEach(function(owner) { if (owner.name == name) { return true; } }); return false; }

运行结果发现返回值都是false,请问我该如何修改代码

9 回复
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)
}

楼主的是作用域弄混了;foreach 内部执行的都是函数体,作用域外面看不到的; 这几楼的回复都比较是正解;

@lcjnil @hyj1991 这2楼经验老道;

@cnwhy 谢谢,测试成功。 我感觉是由于forEach内部代码是异步的,导致我的代码不正确,但是对此的认识还是很模糊,能帮忙讲解一下吗?

@slclub 谢谢讲解,我好好思考一下,然后试试前面两位的建议。@lcjnil @hyj1991 谢谢!!

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 确实不太合适吧

回到顶部