将for循环转换为forEach JavaScript

时间:2018-07-20 16:53:15

标签: javascript for-loop foreach

正在使用一个函数来验证array中的每个数字是true还是false并返回第一个真number

具有如下所示的for循环工作解决方案:

function findElement(arr, func) {
  var num;
  for (var a = 0; a < arr.length; a++) {
    if (func(arr[a])) {
      num = arr[a];
      return num;
    }
  }
  return num;
}

findElement([1, 3, 5, 8, 9, 10], function(num) {
  return num % 2 === 0;
})
// Should return 8

但是我正在尝试(以便更好地了解forEach)将其转换为forEach循环。

到目前为止,这是我要去的地方,但是在确定函数结果为true之后,我看不出如何将num真正从循环中返回:

function findElement(arr, func) {
  if (arr.forEach(func) === true) {
    return num;
  }
}
findElement([1, 2, 3, 4], num => num % 2 === 0);

5 个答案:

答案 0 :(得分:1)

不确定如何使用forEach,但可以使用array.prototype.filter

function findElement(arr, func) {
  return arr.filter(func)[0];
}

@cdhowie建议使用array.prototype.find,以使用[0]

function findElement(arr, func) {
  return arr.find(func);
}

很明显,这只是一个猜测,因为如果数组中的任何项都不符合func的要求,则可能会引发错误。

如果您仍在使用forEach,也许您可​​以这样做:

function findElement(arr, func) {
  matches = []
  arr.forEach((item) => {
      if (func(item)) {
          matches.push(item)
      }
  });
  return matches[0];
}

或者:

function findElement(arr, func) {
  match = null
  arr.forEach((item) => {
     match = (match == null && func(item)) ? item : match
  });
  return match;
}

同样,如果数组中没有项目符合func的要求,则必须检查如何处理错误。

两个代码中的任何一个都会产生

console.log(findElement([1, 3, 5, 8, 9, 10], function(num) { return num % 2 === 0; })))
8

答案 1 :(得分:1)

function findElement(arr, func) {

    var num;

    arr.forEach(function(element) {
        if (!num && func(element)) {
            num = element;
          }
    });

    return num;
  }

有关更多选项,您可以检查以下问题:how to stop Javascript forEach?

答案 2 :(得分:0)

正如已经提到的,这不是应该使用forEach的方式。

但是,您仍然可以获得所需的行为:

function findElement(arr, func) {
  var num;

  arr.forEach(item =>{
    if (func(item)) {
      num = item;
      // .forEach does not have an early return
      // but you can force it to skip elements by removing them
      while (true) {
        // Remove all elements
        var removedItem = arr.shift();
        if (removedItem === undefined) {
          // All elements removed
          break;
        }
    }
  }
  return num;
}

documentation

中甚至提到了这一点

答案 3 :(得分:-1)

也许是这样

function findElement(arr, func) {
  var num = null;

  for (var a = 0; a < arr.length && num === null; a++) {
    var val = arr[a];
    num = func(val) ? val : null; 
  }
  return num;
}

console.log(findElement([1, 3, 5, 8, 9, 10], function(num) {
  return num % 2 === 0;
}));

答案 4 :(得分:-1)

这是带有foreach的findElement方法

function findElement(arr, func) {
var num = 0;

arr.forEach(function(item){
 if (func(item))
    return item;
  })
return num;
}