CoderAnswer - 程序员编程问答

如何从forEach返回一个值

by @Zopy

javascript function

我是JavaScript的新手,我遇到了一个我不明白的问题。

我想编写一个以数组作为参数的函数,如果数组中的所有元素都相同则返回true。

到目前为止我知道一个简单的for循环更有效,但我想用 forEach()来做这个简单的函数。

function isUniform(array) {
    let uniChecker = array[0];
    array.forEach(function(element) {
        if (uniChecker !== element) {
            return false;
        }
    });
    return true;
}

它总是返回true,即使它应该返回false。


3个答案

4 by @James

不幸的是从forEach回调返回对外部作用域没有任何作用,它只是退出回调作用域。虽然forEach _can_被使用但它并不是最有效的,因为没有真正的方法可以提前退出循环。

更好的替代方案是every/[some](https://developer.mozilla。 org / en-US / docs / Web / JavaScript / Reference / Global_Objects / Array / some),这些函数用于测试数组中的项目并检测异常(由您提供的任何条件确定)并在第一个不匹配时退出,例如

const isUniform = arr => arr.every(x => arr[0] === x)

游乐场 <!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

const arr = [1,1,3,1,1,2]
//使用`every`(推荐)
console.log(`Using 'every'...`);
let isUniform = arr => arr.every(x => {
  console.log(`Testing ${x}`);
  return arr[0] === x;
});
console.log(isUniform(arr));
//使用`some`(位更复杂,但仍然可以工作)
console.log(`Using 'some'...`);
isUniform = arr => !arr.some(x => {
  console.log(`Testing ${x}`);
  return arr[0] !== x;
});
console.log(isUniform(arr));

<!-- end snippet -->

2 by @Radonirina Maminiaina

如果将return false添加到forEach中,则无法获得正确的checked值。使用循环,这样您就可以在找到项目时添加中断:

function isUniform(array) {
  let uniChecker = array[0];
  var isChecked = true;
  for (var i = 0; i < array.length; i++) {
    if (uniChecker !== array[i]) {
      isChecked = false;
      break;
    }
  }
  return isChecked;
}

或者您可以使用someevery来测试项目是否存在于数组中。

function isUniform(array) {
  return array.some(x => array[0] === x);
}
2 by @Hien Nguyen

简单的方法,你改为for循环,因为在forEach中什么也不返回

function isUniform(array) {
    let uniChecker = array[0];
    for(i = 0; i < array.length; i++){
        if (uniChecker !== array[i]) {

            return false;
        }
    };
    return true;
}

<!-- begin snippet: js hide: false console: true babel: false -->

<!-- language: lang-js -->

function isUniform(array) {
    let uniChecker = array[0];
    for(i = 0; i < array.length; i++){
        if (uniChecker !== array[i]) {

            return false;
        }
    };
    return true;
}

var a = [2, 2,3];
console.log(isUniform(a));

<!-- end snippet -->


相关问题