我真的是JavaScript新手,遇到了一个我不理解的问题。
我想编写一个将数组作为参数的函数,如果数组中的所有元素都相同,则返回true。
现在,我知道一个简单的for循环会更有效,但是我想使用 forEach()来完成此简单功能。
function isUniform(array) {
let uniChecker = array[0];
array.forEach(function(element) {
if (uniChecker !== element) {
return false;
}
});
return true;
}
即使它应该返回false,它总是返回true。
答案 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;
}
或者您可以使用some
或every
测试项目是否存在于数组中。
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);
}