如何在Javascript中编写Array.prototype.every()方法

时间:2017-07-25 17:34:18

标签: javascript arrays predicate

作为实践,我想编写一个与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。我的代码出了什么问题?有没有更好的方法来写这个?

4 个答案:

答案 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;
&#13;
&#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;
};