Javascript 返回值时,“each”与“for loop”有何不同?

Javascript 返回值时,“each”与“for loop”有何不同?,javascript,functional-programming,find,each,Javascript,Functional Programming,Find,Each,我有我的each函数,我创建该函数是为了模仿underline.js的\u each()来学习Javascript var each = function(list, iteratee) { if (Array.isArray(list)) { // list is array for (var i = 0; i < list.length; i++) { iteratee(list[i], i, list); } }

我有我的
each
函数,我创建该函数是为了模仿underline.js的
\u each()
来学习Javascript

var each = function(list, iteratee) {
    if (Array.isArray(list)) { // list is array
        for (var i = 0; i < list.length; i++) {
            iteratee(list[i], i, list);
        }
    } else if (list.constructor === Object) { // list is object
        for (var key in list) {
            iteratee(list[key], key, list);
        }
    }
};
我认为它会在找到通过外部谓词函数测试的元素的真值后立即返回一个值。但是相反,它给了我一个
未定义的

下面的代码按照我的预期工作。但为什么它们会提供不同的输出

var find = function(list, predicate) {
    if (Array.isArray(list)) { // list is array
        for (var i = 0; i < list.length; i++) {
            if (predicate(list[i])) {
                return list[i];
            }
        }
    } else if (list.constructor === Object) { // list is object
        for (var key in list) {
            if (predicate(list[key])) {
                return list[key];
            }
        }
    }
};
var find=函数(列表,谓词){
如果(Array.isArray(list)){//list是数组
对于(变量i=0;i

我不明白的是,为什么当我将
每个
都包含在我的
查找
函数中时,它们不能像我所期望的那样工作。难道他们的表达方式不一样吗?换句话说,一个是函数式,另一个不是?

这是由于缺少return语句造成的。 每个函数迭代find,但不返回任何内容。谓词中的return语句将输出返回到不需要的每个函数

工作功能示例:

var find = function(list, predicate) {
     var res = undefined/null/whatever;
     each(list, function(elem) {
         if (predicate(elem)) {
             res = elem;
         }
     });
     return res;
};

但是,此函数效率不高,因为它在找到结果时不会停止

这与
返回
的工作方式有关。让我们看看您的代码:

var find = function(list, predicate) {
    // you pass list and an anonymous callback to `each`
    each(list, function (elem) {
        // if this condition is true
        if (predicate(elem)) {
            // return elem
            return elem;
        }
    });
}
问题是
returnelem
应用于匿名回调,而不是
find
函数

如果希望能够“中断”每个
循环,可以在
每个
中检查for循环每次迭代的当前状态

// only going to write for arrays
var each = function (list, iteratee) {
    for (var i = 0; i < list.length; i++) {
        if (iteratee(list[i], i, list)) continue;
        else break;
    }
});
// then in find:
var find = function (list, predicate) {
    var ret = null
    each(list, function(elem) {
        if (predicate(elem)) {
            ret = elem;
            return false;    // return false, since we no longer wish to continue
        }
    });
    return ret;
};

这个解决方案唯一的问题是它扭曲了
每个
的含义
每个
直观地表示“完成所有事情”,而第二个解决方案不一定能做到这一点。

谢谢。我也在寻找一种方法,让它在找到答案时停止迭代。非常感谢。“我能看到发生了什么。”凯莱克我补充了第二个解决方案。我不确定我是否会建议使用它,但它仍然有效。非常有洞察力。非常感谢你@KyleC你的问题让我想起了我以前见过的一个问题(因为你使用了
谓词
// only going to write for arrays
var each = function (list, iteratee) {
    for (var i = 0; i < list.length; i++) {
        if (iteratee(list[i], i, list)) continue;
        else break;
    }
});
// then in find:
var find = function (list, predicate) {
    var ret = null
    each(list, function(elem) {
        if (predicate(elem)) {
            ret = elem;
            return false;    // return false, since we no longer wish to continue
        }
    });
    return ret;
};
var each = function (list, iteratee) {
    for (var i = 0; i < list.length; i++) {
        if (iteratee(list[i], i, list)) {
            continue;
        } else {
            return list[i];
        }
    }
    // didn't find anything, so `return null`
    return null;
});
var find = function (list, predicate) {
    return each(list, function(elem) {
        // if `predicate`, return false, so the loop breaks
        return !predicate(elem);
    });
};