如何打破功能式迭代?

时间:2010-02-12 22:15:19

标签: 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[i]);
  }
};

这很酷。但是现在我想实现另一个功能:

// Checks if a collection contains an item.
Utils.has = function(collection, item)
{
    Utils.foreach(collection, function(obj) {
        if (item === obj) {
            return true; // How to force a return from the foreach function?
        }
    });
    return false;
};

正如您所看到的,我无法实现“has”函数,因为我的return语句不会破坏迭代。

有人可以为此问题推荐解决方案吗?

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这是真正快速且未经测试的事情(周五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":""}, "");

答案 2 :(得分:1)

您需要对每个修改。

首先修改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;
      }
    }
  }
};

答案 3 :(得分:0)

我认为你不需要放弃你的结构 - 为什么不抛出并捕获错误以摆脱循环?

  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;
};