我正在尝试创建一个以数组作为参数的函数,并且仅当数组中的所有项都相同时才返回“true”。
我尝试使用 for loop ,我尝试使用 forEeach loop
第一个工作很棒。第二个不工作!
的为什么吗
这是我的第一个代码:
function isUniform(ary) {
var first = ary[0];
for (i = 0; i < ary.length; i++) {
if (first !== ary[i]) {
return false;
}
}
return true;
}
console.log(isUniform([1, 2, 1]));
这是我的第二个:
function isUniform(ary) {
var first = ary[0];
ary.forEach(function(element) {
if (first !== element) {
return false;
}
});
return true;
}
console.log(isUniform([1, 2, 1]));
答案 0 :(得分:6)
&#34;内部&#34;第二个示例中的return
是从传递给forEach
的函数返回的。 不会导致isUniform
函数立即返回。相反,您传递给forEach
的这个小匿名函数很快就会为数组的每个元素运行完成。
完成所有元素的运行后,您的isUniform
函数会返回true。
答案 1 :(得分:1)
通过返回true,您将返回true到forEach函数回调,而您的for循环将返回true返回该函数。如果要使用当前方法,则在执行回调时,forEach需要引用对象。这就是它与你的for循环的不同之处。
function isUniform(ary) {
var first = ary[0];
val = true;
ary.forEach(element => {
if (first !== element) {
val = false;
}
});
return val;
}
console.log(isUniform([1, 1, 1]));
console.log(isUniform([1, 2, 1]));
&#13;
您可以利用所有功能。
arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
arr2 = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1];
console.log(arr1.every((a, _, aa) => aa[0] === a));
console.log(arr2.every((a, _, aa) => aa[0] === a));
&#13;
答案 2 :(得分:0)
你无法打破forEach。
试试这个。你可以用旗帜做到这一点。
var falg = false;
function isUniform(ary){
var first = ary[0];
ary.forEach(function(element) {
if (first !== element) {
falg = true;
return false;
}
});
if(falg)
return false
return true;
}
console.log(isUniform([1,2,1]));
答案 3 :(得分:0)
@ Arrow的帖子已经解决了部分问题,如果你使用forEach
,它不关心返回值,你必须自己积累结果(同样,没有'正常'从循环中突破的方法,但如果你真的想要,你可以抛出一个异常。
对于'为什么'部分:因为定义。 forEach
不关心返回值,并且无条件地运行所有元素的传递函数。
forEach
的简化实现如下:
Array.prototype.myForEach=function(callback){ // or callback,diz
for(var i=0;i<this.length;t++)
callback(this[i],i,this); // or callback.call(diz,this[i],i,this);
}
完全忽略callback
的结果。 (注释部分添加了对可选context-argument的支持)
'更官方'的polyfill会做一些额外的检查,但也不复杂:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill
答案 4 :(得分:-1)
你可以尝试这个,改变x的var元素,并使用lambdas
function isUniform(ary) {
var first = ary[0];
ary.forEach((x) => {
if(first !== x){
return false;
}
});
return true;
}