Javascript 如何打破函数式迭代?
我正在试验函数式Javascript,遇到了一个有趣的情况。我有一个foreach函数,它接受一个集合和函数对象: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[
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;
};