我想知道JavaScript中的 forEach 是否可以返回,这是我的代码:
var a = [0, 1, 2, 3, 4];
function fn(array) {
array.forEach(function(item) {
if (item === 2) return false;
});
return true;
}
var ans = fn(a);
console.log(ans); // true
我想知道2是否在我的数组中,如果是,则返回false,但似乎 forEach 函数已经循环整个数组并忽略return。
我想知道我是否可以通过 forEach 得到我想要的答案(我知道我可以得到我想用的(...))?亲爱的朋友,请帮助我,非常感谢!
答案 0 :(得分:6)
您可以使用indexOf代替https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf
function fn(array) {
return (array.indexOf(2) === -1);
}
同样来自forEach的文档 - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
注意:除了by之外,无法停止或中断forEach()循环 抛出一个例外。如果你需要这样的行为,.forEach() 方法是错误的工具,而是使用普通循环。
因此,返回值不能以您使用它的方式使用。但是你可以抛出(除非你真的需要在那里引发错误,否则不建议这样做)
function fn(array) {
try {
array.forEach(function(item) {
if (item === 2) throw "2 found";
});
}
catch (e) {
return false;
}
return true;
}
答案 1 :(得分:4)
在这种情况下,.indexOf()
可能是您想要的,但是当简单的相等比较太时,还有.some()
:
var ans = a.some(function(value) { return value === 2; });
如果回调为任何元素返回.some()
,则true
函数返回true
。 (一旦回调返回true
,函数就会返回,因此它不会超出第一场比赛的范围。)
您通常可以使用.reduce()
函数作为更一般的迭代机制。如果您想计算数组中2
的实例数,例如:
var twos = a.reduce(function(c, v) { if (v === 2) c += 1; return c; }, 0);
答案 2 :(得分:1)
forEach 返回 undefined by specification。如果要查明某个特定值是否在数组中,则存在 indexOf 。对于更复杂的问题,有 some ,它允许函数测试值并在函数第一次返回 true 时返回 true ,或者否则为假:
a.some(function(value){return value == 2})
显然是一个微不足道的案例,但请考虑是否要确定数组是否包含任何偶数:
a.some(function(value){return !(value % 2)})
或作为ECMA2015箭头功能:
a.some(value => !(value % 2));
如果要测试数组中是否重复某个特定值,可以使用lastIndexOf:
if (a.indexOf(value) != a.lastIndexOf(value) {
// value is repeated
}
或测试任何重复项,再次一些或每个都可以完成这项任务:
var hasDupes = a.some(function(value, i, a) {
return a.lastIndexOf(value) != i;
});
某些和每个的一个优点是它们只处理数组成员,直到满足条件,然后它们退出而 forEach 将处理所有成员。
答案 3 :(得分:1)
其他人提到.indexOf()
和.some()
。我想我会补充说,一个好的老式for
循环为您提供绝对最多的迭代控制,因为您控制迭代并且您的处理代码没有嵌入回调函数中。
虽然.indexOf()
已经完全符合您的需求,但此代码仅显示了在使用旧式for
循环时如何直接返回。这些天它有点不受欢迎,但通常仍然是更好的循环控制的最佳选择。
function fn(array) {
for (var i = 0, len = array.length; i < len; i++) {
if (array[i] === 2) return false;
}
return true;
}
使用for
循环,您可以向后迭代(在迭代期间从数组中删除项时很有用),您可以插入项并更正迭代索引,您可以立即返回,您可以跳过索引等...
答案 4 :(得分:0)
你说你想要forEach,所以我修改了你的代码:
function fn(array) {
var b = true;
array.forEach(function (item) {
if (item === 2) {
b = false;
}
});
return b;
}
答案 5 :(得分:0)
var a = [0, 1, 2, 3, 4];
function fn(array, callback) {
var r = true;
array.forEach(function(item) {
if (item === 2) r = false;
});
callback(r);
}
fn(a, function(data) {
console.log(data) //prints false.
});
您可以如上所述使用callbacks
返回所需的数据。这与return语句不同,但是您将获得数据。