嵌套 forEach 和 for 循环的函数不会返回 false

Nic*_*man 6 javascript foreach for-loop return function

我正在做一个JS 练习的算法挑战。我有一个循环运行的程序,当满足条件时,该函数应该返回 false。然而,当条件满足时,返回不起作用,函数最终总是返回 true。

const isDiagonalLeftWristband = (band) => {
  band.forEach((row, y) => {
    row.forEach((item, x) => {
      for(let i = 0; (i < band[y].length - x) && (i < band.length - y); i++) {        
        if (band[y][x] !== band[y+i][x+i]) {
          console.log(false) //FALSE GETS OUTPUTTED MULTIPLE TIMES
          return false;
        }
      }
    })
  })
  return true;
}


const band3 = [
  ["A", "B", "C"],
  ["C", "Z", "B"],
  ["B", "C", "A"],
  ["A", "B", "C"]
];

console.log(isDiagonalLeftWristband(band3))
Run Code Online (Sandbox Code Playgroud)

输出:

false //from console log
false //from console log
true //from function return statement
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激!

dom*_*ndo 3

只会return false退出(item, x) => {}匿名函数,而不是isDiagonalLeftWristband()像您期望的那样退出。两者forEach执行完后isDiagonalLeftWristband()总会return true结束。您可以使用循环来避免此问题。

const isDiagonalLeftWristband = (band) => {
  for (let [y, row] of band.entries()) {
    for (let [x, item] of row.entries()) {
      for(let i = 0; (i < band[y].length - x) && (i < band.length - y); i++) {        
        if (band[y][x] !== band[y+i][x+i]) {
          console.log(false) //FALSE GETS OUTPUTTED MULTIPLE TIMES
          return false;
        }
      }
    }
  }
  return true;
}

const band3 = [
  ["A", "B", "C"],
  ["C", "Z", "B"],
  ["B", "C", "A"],
  ["A", "B", "C"]
];

console.log(isDiagonalLeftWristband(band3))
Run Code Online (Sandbox Code Playgroud)

forEach并非旨在提前终止。它将始终迭代所有元素。(就在名字里:))。来自 MDN 文档:

除了抛出异常之外,没有其他方法可以停止或中断 forEach() 循环。如果您需要这样的行为,那么 forEach() 方法是错误的工具。

提前终止可以通过以下方式完成:

A simple for loop
A for...of / for...in loops
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()
Run Code Online (Sandbox Code Playgroud)

数组方法:every()、some()、find() 和 findIndex() 使用返回真值的谓词来测试数组元素,以确定是否需要进一步迭代。

您可以改为使用建议的函数之一,该函数旨在通过谓词测试数组的元素。every()测试数组的所有元素是否通过某些测试;至少在语义上,这就是您所需要的。

A simple for loop
A for...of / for...in loops
Array.prototype.every()
Array.prototype.some()
Array.prototype.find()
Array.prototype.findIndex()
Run Code Online (Sandbox Code Playgroud)