javascript - Javascript - 如何从forEach中返回值

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

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

现在,我知道一个简单的循环会更有效,但是我想用forEach()来做这个简单的函数。


function isUniform(array) {


 let uniChecker = array[0];


 array.forEach(function(element) {


 if (uniChecker !== element) {


 return false;


 }


 });


 return true;


}



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

时间:

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;


}



不幸的是,从forEach回调返回对外部作用域没有作用,它只是退出回调作用域,尽管forEach可以使用,但是它不是最有效的,因为没有实际的方法可以早期退出循环。


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



Playground


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

简单的方法是,你改为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));

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

如果将return false添加到forEach中,则无法获得已检查的正确值,使用for循环,这样你就可以在找到你的项目时添加break:


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


}




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



checkIfAllEqual ([5 ,5 ,5 ,5 ,5 ,5 ,5 ,5] )会return true 。

你可以使用a来获取第一个元素并迭代其余元素并返回。


function isUniform([a, rest]) {


 return rest.every(b => a === b);


}



...