JavaScript中的forEach可以返回吗?

JavaScript中的forEach可以返回吗?,javascript,arrays,foreach,Javascript,Arrays,Foreach,我想知道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,但是fo

我想知道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函数似乎已经循环了整个数组并忽略了返回


我想知道我是否能用forEach得到我想要的答案(我知道我能得到我想要的(…)用的东西)?亲爱的朋友,请帮助我,非常感谢

您可以改用indexOf


同样来自forEach的文件-

注意:除了通过 正在引发异常。如果您需要这种行为,那么.forEach() 方法是错误的工具,请改用普通循环

因此,返回值不能按您使用它的方式使用。但是,您可以执行抛出操作(不建议这样做,除非您确实需要在那里引发错误)


在这种情况下,
.indexOf()
可能是您想要的,但是当简单的相等比较太简单时,也有
.some()

如果回调函数为任何元素返回
true
,则
.some()
函数将返回
true
。(只要回调返回
true
,函数就会返回,因此它不必查看第一个匹配项以外的内容。)

通常可以使用
.reduce()
函数作为更通用的迭代机制。如果要计算数组中
2
的实例数,例如:

 var twos = a.reduce(function(c, v) { if (v === 2) c += 1; return c; }, 0);
forEach返回未定义的。如果您想知道数组中是否有特定的值,可以使用indexOf。对于更复杂的问题,有一些允许函数测试值,并在函数第一次返回true时返回true,否则返回false:

a.some(function(value){return value == 2})

显然是一个小事,但是如果你想确定数组中是否包含偶数:

a.some(function(value){return !(value % 2)})
或作为ECMA2015箭头功能:

a.some(value => !(value % 2));
如果要测试特定值是否在数组中重复,可以使用:

或者,为了测试是否存在任何重复项,某些或每个重复项也将执行以下操作:

var hasDupes = a.some(function(value, i, a) {
  return a.lastIndexOf(value) != i;
});

某些和每个的优点是,它们只处理数组的成员,直到满足条件,然后退出,而forEach将处理所有成员。

其他人提到了
.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;
}
函数fn(数组){
对于(变量i=0,len=array.length;i

使用
for
循环,您可以向后迭代(在迭代过程中从数组中删除项时非常有用),您可以插入项并更正迭代索引,您可以立即返回,您可以跳过索引,等等。

您说过要使用forEach,因此我修改了您的代码:

function fn(array) {
    var b = true;
    array.forEach(function (item) {
        if (item === 2) {
            b = false;
        }
    });
    return b;
}
var a=[0,1,2,3,4];
函数fn(数组、回调){
var r=真;
array.forEach(函数(项){
如果(项目===2)r=false;
});
回调(r);
}
fn(a,功能(数据){
console.log(data)//打印错误。

});我的代码只是一个示例,我的真正目的是通过使用forEach…@ZichiHan找到数组中的重复项-我刚刚编辑了我的答案以涵盖这一点。简短回答-如果你必须这样做,你需要使用投掷。干杯为什么你认为try..catch是必需的?@RobG-我认为它不是必需的,也不是推荐的(见我答案中的粗体部分)。我只是说明了如何退出forEach循环(因为OP想知道它为什么不工作,正如MDN blockquote中提到的)。希望不要太混乱。干杯哦,等等,这里有一个相当难看的解决方法-你想知道你是否可以从整个迭代中返回一个值吗?在这种情况下,请参阅我关于使用
.reduce()
的回答。我的代码只是一个示例,我的真正目的是通过使用forEach在数组中查找重复项…@ZichiHan我不明白这是什么意思。你想看看数组中是否不止一次存在某个特定项吗?@ZichiHan哦,等等,也许我确实理解了-我想你应该使用
.reduce()
,正如我上面解释的那样。
if (a.indexOf(value) != a.lastIndexOf(value) {
  // value is repeated
}
var hasDupes = a.some(function(value, i, a) {
  return a.lastIndexOf(value) != i;
});
function fn(array) {
  for (var i = 0, len = array.length; i < len; i++) {
    if (array[i] === 2) return false;
  }
  return true;
}
function fn(array) {
    var b = true;
    array.forEach(function (item) {
        if (item === 2) {
            b = false;
        }
    });
    return b;
}