Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何打破函数式迭代?_Javascript - Fatal编程技术网

Javascript 如何打破函数式迭代?

Javascript 如何打破函数式迭代?,javascript,Javascript,我正在试验函数式Javascript,遇到了一个有趣的情况。我有一个foreach函数,它接受一个集合和函数对象: var Utils = {}; // Applies a functor to each item in a collection. Utils.foreach = function(collection, functor) { for (var i = 0; i < collection.length; i++) { functor(collection[

我正在试验函数式Javascript,遇到了一个有趣的情况。我有一个foreach函数,它接受一个集合和函数对象:

var Utils = {};

// Applies a functor to each item in a collection.
Utils.foreach = function(collection, functor)
{
  for (var i = 0; i < collection.length; i++)
  {
    functor(collection[i]);
  }
};
如您所见,我无法实现“has”函数,因为我的return语句没有中断迭代


有人能为这个问题推荐一个解决方案吗?

我想你想要的不是真正的
forEach
,而是(其他语言称之为
any
)。couterpart是(或其他语言中的
all
)。您将在MDC上找到一个示例实现。

这里有一些真正快速且未经测试的东西(现在是周五4:50回家的时间)。稍后我将尝试测试并更新此帖子。看看这是否有帮助:

Utils = {};
Utils.foreach = function(collection, functor) {
    loop: for (var i in collection) {
        if (functor(collection[i])) {
            alert("breaking the loop!");
            break loop;
        }
    }
};
Utils.has = function(collection, item) {
    var bolReturn  = false;
    Utils.foreach(collection, function(obj) {
        if (item === obj) {
            bolReturn = true;
            return true;
        }
        return false;
    });
    return bolReturn;
};
Utils.has({"test":""}, "");

你需要对每一个进行修改

首先修改
has

Utils.has = function (collection, item) {
  var found = false;
  Utils.foreach(collection, function (obj) {
    if (item === obj) {
      found = true;
      return false;
    }
  });
  return found;
};
然后,您需要修改
forEach
,以便在它得到
false

Utils.foreach = function (collection, functor) {
  var prop;
  for (prop in collection) {
    if (prop.hasOwnProperty(prop)) {
      if (functor(collection[prop]) === false) {
        return;
      }
    }
  }
};

我不认为你需要放弃你的结构- 为什么不抛出并捕获一个错误来打破循环呢

  Utils.has= function(collection, item){
    try{
        ControlCenter.foreach(collection, function(obj){
            if(item=== obj){
                throw 'found it!'
            }
        });
    }
    catch(er){
        if(er== 'found it!') return true;
    }
    return false;
};

您需要使用捕获布尔标志变量的闭包来指示它是否应进一步处理项,并根据需要翻转标志。只需使用
数组。一些
()。请检查jQuery的“each”方法。
  Utils.has= function(collection, item){
    try{
        ControlCenter.foreach(collection, function(obj){
            if(item=== obj){
                throw 'found it!'
            }
        });
    }
    catch(er){
        if(er== 'found it!') return true;
    }
    return false;
};