如何从forEach返回值

时间:2019-05-14 11:16:00

标签: javascript function

我真的是JavaScript新手,遇到了一个我不理解的问题。

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

现在,我知道一个简单的for循环会更有效,但是我想使用 forEach()来完成此简单功能。

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

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

8 个答案:

答案 0 :(得分:4)

不幸的是,从forEach回调返回对外部作用域没有任何作用,只是退出了回调作用域。尽管可以使用forEach ,但这并不是最有效的方法,因为没有真正的方法可以提早退出循环。

更好的选择是every / some,这些函数旨在测试数组中的项目并检测异常(由您提供的条件决定)并在第一个不匹配时退出,例如

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

游乐场

const arr = [1,1,3,1,1,2]
// using `every` (recommended)
console.log(`Using 'every'...`);
let isUniform = arr => arr.every(x => {
  console.log(`Testing ${x}`);
  return arr[0] === x;
});
console.log(isUniform(arr));
// using `some` (bit more complicated but can still work)
console.log(`Using 'some'...`);
isUniform = arr => !arr.some(x => {
  console.log(`Testing ${x}`);
  return arr[0] !== x;
});
console.log(isUniform(arr));

答案 1 :(得分:2)

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

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 :(得分:2)

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

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

            return false;
        }
    };
    return true;
}

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

答案 3 :(得分:2)

ES6

很显然,由于我们在各地都可以使用ES6,因此您可以使用Array Every Prototype

['a', 'a', 'a', 'a'].every( (el, index, arr) => el === arr[0] )

//For NON-ES6 way

function allItemsAreEqual(elements) {
  return new Set(elements).size == 1;
}

console.log(allItemsAreEqual(['a', 'a', 'a', 'a'])) // true

答案 4 :(得分:1)

const checkIfAllEqual = inputArray => inputArray.every( value => value === inputArray[0] )

checkIfAllEqual([5,5,5,5,5,5,5,5,5])将返回true。

答案 5 :(得分:1)

forEach函数不会返回您期望的值(docs here),这意味着您的isUniform函数将始终返回true。对于您要尝试执行的操作,可以使用老式的for循环,也可以使用array.every(isTheSame)

使用for循环

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

使用array.every

function isUniform(array) {
    // Returns true if for every item in the array, the callback
    // (item === array[0]) evaluates to true
    return array.every(item => item === array[0]);
}

答案 6 :(得分:1)

  

forEach()丢弃返回值,并始终返回未定义

因此,无论您在代码内执行什么操作,都永远不会返回forEach的返回值

您可以创建一个在满足条件时设置为false的标志(如果您想使用ForEach,则为建议)

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

答案 7 :(得分:0)

您可以对第一个元素进行分解,然后迭代其余元素并尽早返回。

function isUniform([a, rest]) {
    return rest.every(b => a === b);
}