JavaScript中的forEach可以回报吗?

时间:2015-08-17 02:18:30

标签: 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,但似乎 forEach 函数已经循环整个数组并忽略return。

我想知道我是否可以通过 forEach 得到我想要的答案(我知道我可以得到我想用的(...))?亲爱的朋友,请帮助我,非常感谢!

6 个答案:

答案 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语句不同,但是您将获得数据。