作为实践,我想编写一个与Array.prototype.every()方法类似的函数all()。仅当提供的谓词对数组中的所有项返回true时,此函数才返回true。
Array.prototype.all = function (p) {
this.forEach(function (elem) {
if (!p(elem))
return false;
});
return true;
};
function isGreaterThanZero (num) {
return num > 0;
}
console.log([-1, 0, 2].all(isGreaterThanZero)); // should return false because -1 and 0 are not greater than 0
不知怎的,这不起作用并返回true
。我的代码出了什么问题?有没有更好的方法来写这个?
答案 0 :(得分:2)
您无法通过返回突破Array#forEach循环。改为使用for循环。
注意:这是Array#every的部分实现,用于演示返回问题。
Array.prototype.all = function (p) {
for(var i = 0; i < this.length; i++) {
if(!p(this[i])) {
return false;
}
}
return true;
};
function isGreaterThanZero (num) {
return num > 0;
}
console.log([-1, 0, 2].all(isGreaterThanZero));
&#13;
答案 1 :(得分:0)
返回foreach函数不会从函数返回值。你可以像这样编码。
Array.prototype.all = function (p) {
for(var i = 0; i < this.length; i++){
if (!p(this[i]))
return false;
}
return true;
};
function isGreaterThanZero (num) {
return num > 0;
}
var result = [2, 3, 4].all(isGreaterThanZero);
console.log("result", result);
答案 2 :(得分:0)
其他答案略有错误。您传入的回调应该使用3个参数调用:当前项,索引和整个数组。这就是本机Array.every
以及大多数本机数组函数的工作方式。你的回调可以选择使用这些参数,但大部分时间都没有。
Array.prototype.all = function (p) {
for(var i = 0; i < this.length; i++) {
if (!p(this[i], i, this)) {
return false;
}
}
return true;
};
function isGreaterThanZero (num) {
return num > 0;
}
console.log([-1, 0, 2].all(isGreaterThanZero)); // should return false because -1 and 0 are not greater than 0
答案 3 :(得分:0)
您只能通过抛出异常来停止forEach()
循环。只需使用普通的for
循环。
Array.prototype.all = function (p) {
for(var i = 0; i < this.length; i++) {
if(!p(this[i])) {
return false;
}
}
return true;
};
如果允许使用Array.prototype.every()
以外的任何方法,则可以:
Array.prototype.all = function (p) {
return this.filter(p).length == this.length;
};