【问题标题】:Turning for loop into forEach JavaScript将 for 循环转换为 forEach JavaScript
【发布时间】:2024-10-14 17:10:01
【问题描述】:

使用一个函数来验证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 循环。

这是我到目前为止的位置,但是在确定函数结果为真之后,我看不到如何将num 真正返回到循环之外:

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

【问题讨论】:

  • var num; if (num = arr.find(func)) return num;
  • forEach 无法提前返回。
  • @Ele 啊,我需要了解 .find - 它看起来很适合这个(与 .filter(func) 一起),但我想了解 forEach!
  • 那么你想要一个 forEach 的实现吗?
  • @daggett forEach 不是解决这个特殊问题的好选择。事实上,我很少发现它在处理数组时很有用。 map, filter, and reduce can do most of the heavy lifting,虽然还有很多其他的迭代模式。你的函数可能最好写成first([1, 2, 3, 4], num =&gt; num % 2 === 0),它可以接受一个谓词并返回与谓词匹配的第一个结果。

标签: javascript for-loop foreach


【解决方案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

【讨论】:

  • 是的,这行得通 - 我也有这个解决方案我只是想知道 forEach 的功能!
  • @daggett,我在 forEach 中添加了一个示例。
  • arr.filter(func)[0] 更好地表示为arr.find(func)。前者将迭代整个数组,而后者将在第一次匹配时停止。
【解决方案2】:
function findElement(arr, func) {

    var num;

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

    return num;
  }

更多选项可以查看这个问题:how to stop Javascript forEach?

【讨论】:

    【解决方案3】:

    如前所述,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中甚至提到了这一点

    【讨论】:

      【解决方案4】:

      可能是这样的

      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;
      }));
      

      【讨论】:

      • forEach 在哪里?
      【解决方案5】:

      这是使用 foreach 的 findElement 方法

      function findElement(arr, func) {
      var num = 0;
      
      arr.forEach(function(item){
       if (func(item))
          return item;
        })
      return num;
      }
      

      【讨论】:

      • 这将始终返回 0,因为 forEach 不能提前返回