javascript回调函数选择

javascript回调函数选择,javascript,arrays,function,callback,closures,Javascript,Arrays,Function,Callback,Closures,所以基本上我需要使用我在filter函数中实现的each函数,这样filter函数只返回myArray中大于2的项。我完全卡住了 var myArray = [1, 2, 3, 4, 5]; function each(collection, callback) { for (var i = 0; i < collection.length; i++) { callback(collection[i]); } } function filter(coll

所以基本上我需要使用我在filter函数中实现的each函数,这样filter函数只返回myArray中大于2的项。我完全卡住了

var myArray = [1, 2, 3, 4, 5];

function each(collection, callback) {
    for (var i = 0; i < collection.length; i++) {
        callback(collection[i]);
    }
}

function filter(collection, test) {
    var returnAr = [];
    for (var i = 0; i < collection.length; i++) {
        if (test(collection[i])) {
            returnAr.push(collection[i])
        }
    }
    //instead of using "for(var i  = 0; i < collection.length; i++)"
    // how can i use the each function i implemented above?

    return returnAr;
}

filter(myArray, function(n) {
    return n > 2;
}

你不能。上面的“each”函数对集合的所有项执行回调。但在“filter”中,您要根据回调的结果决定是否在结果数组中包含项。所以“filter”和“each”都是不同的操作。无论您在当前函数中做什么,都是正确的过滤方式。

每个函数的签名都采用类似于数组的方式,并使用元素调用函数

function each(collection, callback) {
    for (var i = 0; i < collection.length; i++) {
        callback(collection[i]);
    }
}
请注意,集合[i]是回调的第一个参数

您的回调将具有以下格式:

function(element) {
    // do stuff
}

如果您确实只想根据给定的条件筛选数组,则以下是所需的全部代码:

myArray.filter(function(item) { return item > 2 })
each函数通过将数组中的每个项作为函数参数传递来调用其回调。因此,正确的称呼方式是:

each(collection, function(item) {
    if (test(item)) {
       // ...
    }
}
Javascript并没有提供一种很好的自文档方式来指定函数签名[1]。通常,这可以通过阅读API文档来解决。但是,如果这是您自己的代码,并且没有API文档,那么您需要了解如何调用回调。在这种情况下,它被称为:

callback(collection[i]);
这告诉我们回调函数应该接受一个参数,该参数是数组中的单个项


[1] :也称为prototype,不,不是prototype这个词的javascript意义,而是prototype这个词的C意义

你的代码和我的代码一模一样,lol。与正确的答案(即原始的post代码)相比,它不起作用。我不会给你答案,我只是想把你推向它。美好的我正在阅读有说服力的Javascript高阶函数,希望我能达到你想要的任何目标。哈哈,那本书太棒了!每一个都将替换for循环,而不替换其他内容,因此您必须将测试封装在回调中。Filter使用回调函数只是为了得到true或false,但是每个函数都会使用回调函数来改变returnAri I我就快到了,我的朋友lol,我的海滩之子,我的搭档,他一直在做结对编程。成年男子你说什么听起来像fghx lol对吗?这个答案在上下文中是不合适的。Michael,你必须把一切都放在一边,修改过滤函数的实现,因为问题就在这里。是的,它非常严格,所以你必须配合它们。嗯,你的问题不清楚你为什么要实现EcmaScript语言已经为你实现的东西。是的,我知道EcmaScript有这样的功能。关键是要实践封装。lol抱歉…他们强迫我理解并使用封装函数filtercollection,test{var returnAr=[];每个集合,functionitem{iftestitem{returnAr.pushitem}}returnAr;}感谢slebetman,你的评论修复了最后一个严重的语法错误。也非常感谢cdosborn。该死的结对编程的家伙,他可能会说封装或fghx,我会在正确的方向。但我不能真的责怪他,因为他的老板强迫他像他那样做手术。这是一次很好的学习经历。有时候只需要一个简单的例子就可以给你一个惊喜。我完全没有意识到每次我使用回调时我都需要实现它lol。我在这次采访中准备好了弹药,所以我进行了二进制搜索,mergesort,link link only lol,treeok only,但只是勉强专注于回调。该死的,作为回报,我知道如何用很少的工具和一点也不昂贵的工具快速拆卸变速箱和/或发动机。与美国相比,马来西亚有非常好的日本车。享受那些JDM汽车吧,哈哈
callback(collection[i]);