Javascript forEach不像for循环那样向外部函数返回值
我试图在我的Javascript forEach不像for循环那样向外部函数返回值,javascript,Javascript,我试图在我的foreach中输入一个返回值,但它返回未定义的。但当我将相同的if语句放入for循环中时,它返回正确的值。为什么会这样 this.SpriteAndHull.forEach(element => { if (element.name == name) { return element; } }); 使用.forEach()时,您的return语句从传递到forEach回调的函数返回,而不是从外部函数返回 编辑:应该注意的是,从.for
foreach
中输入一个返回值,但它返回未定义的
。但当我将相同的if
语句放入for循环中时,它返回正确的值。为什么会这样
this.SpriteAndHull.forEach(element => {
if (element.name == name) {
return element;
}
});
使用.forEach()
时,您的return
语句从传递到forEach回调的函数返回,而不是从外部函数返回
编辑:应该注意的是,从.forEach()
函数返回不起任何作用,因为.forEach()
(按设计)不支持返回值,并且总是返回未定义的
您可以做的一件事是设置元素,然后返回它,或者简单地使用不同的迭代器函数,如下所示:
function getElementByName(elems, name) {
let elem;
elems.forEach(element => {
if (element.name === name) {
elem = element;
}
});
return elem;
}
或:
因为forEach
总是返回undefined
(实际上),并且它完全忽略回调的返回值(如果有)。您的返回元素
在回调中,因此被忽略
您可能需要一个for of
循环:
for (const element of this.SpriteAndHull) {
if (element.name == name) {
return element;
}
}
您需要的是find
// element will either ben the element that matches the name, or it will be undefined if nothing is found
const element = this.SpriteAndHull.find(el => el.name === name);
for…of
是功能性方法的一个很好的替代方法,可以产生更好的性能+1'd.forEach并不是真正的功能,它只是方法链接。Map/filter/reduce是函数式的,因为它们强调不变性。@badeheuristics是真的,我应该澄清一下,我的意思是函数式的“使用函数进行迭代”,而不是函数式的编程paradigm@mhodges-谢谢。:-)forEach
的真正性能优势(可能并不重要)是在发现时提前停止。您的find
解决方案也有同样的好处。@mhodges-是的。当然,从理论上讲,像
for Of
这样的迭代涉及函数调用。但是,除非您对Array.prototype
,否则我们可以相当肯定JavaScript引擎将在热代码中优化其中的大部分…:-)出于好奇,我如何从回调中获取返回值?@MikeOttink with.forEach()
您没有。该特定迭代器没有返回值-它总是未定义的
。但是您可以使用.filter()
或.find()
之类的方法来获取返回值。
// element will either ben the element that matches the name, or it will be undefined if nothing is found
const element = this.SpriteAndHull.find(el => el.name === name);