nit*_*ian -1 javascript foreach
请考虑以下代码段:
function isUniform(myArray) {
myArray.forEach(function(element) {
if (element !== myArray[0]) {
return false;
}
});
return true;
}
Run Code Online (Sandbox Code Playgroud)
目的是该函数应该将数组作为输入,并且true如果数组中的所有元素都相同false则返回.
例如:
isUniform([1,2,1,1]); //应返回false isUniform([1,1,1,1]); //应该返回true
但是,if条件:
if (element !== myArray[0])
Run Code Online (Sandbox Code Playgroud)
在isUniform([1,2,1,1])的情况下似乎永远不会成立.
我错过了什么?
因此,return true不返回函数的值isUniform,它返回您为forEach方法提供的回调值.forEach实际上只用于创建副作用.因此forEach,对每个元素执行回调,看到回调返回false,但之后没有与该值有任何关系,因此它将其抛出并继续到数组中的下一个元素.在遍历数组之后,它继续到下一行代码并返回true该函数.
您可以使用的一种方法forEach是声明一个初始化为true的变量,并在回调中操作该变量.这是必要的,因为没有办法forEach尽早结束循环的执行.所以你可能改用:
function isUniform(myArray) {
var passing = true;
myArray.forEach(function(element) {
if (element !== myArray[0]) {
passing = false;
}
});
return passing;
}
Run Code Online (Sandbox Code Playgroud)
或者您可以使用for循环或for-of循环,在这种情况下,return语句将按照您最初的预期工作.你可能已经熟悉了for循环.For-ofES2015中引入了循环(因此它们可能无法在所有JS引擎上运行).一个for-of循环是这样的:
function isUniform(myArray) {
for (element of myArray) {
if (element !== myArray[0]) {
return false
}
}
return true
}
Run Code Online (Sandbox Code Playgroud)
但是,执行此操作的最佳方法可能是使用内置数组方法every,true如果数组中的每个元素都通过了回调中提供的测试,则返回该方法.因此,您可以测试每个元素,看它们是否等于数组中的第0个元素,因此彼此相等:
function isUniform(myArray) {
return myArray.every(function (currentElement,index,array) {
return currentElement === array[0]
})
}
Run Code Online (Sandbox Code Playgroud)
这很短,你甚至不需要把它放在它自己的函数中 - 如果你不这样做,你的代码可能会更具可读性.
文档:Array.prototype.every:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/every
For-of循环:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of