【问题标题】:javascript callback function selectionjavascript回调函数选择
【发布时间】:2015-05-28 16:30:31
【问题描述】:

所以基本上我需要使用我在过滤器函数中实现的每个函数,以便过滤器函数只返回 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;
}

【问题讨论】:

    标签: javascript arrays function callback closures


    【解决方案1】:

    each 函数通过将数组中的每个项目作为函数参数传递来调用其回调。因此,正确的调用方式是:

    each(collection, function(item) {
        if (test(item)) {
           // ...
        }
    }
    

    Javascript 并没有提供一种很好的自记录方式来指定函数签名[1]。通常这可以通过阅读 API 文档来解决。但是,如果这是您自己的代码并且它没有附带 API 文档,那么您需要查看回调是如何调用的。在这种情况下,它被称为:

    callback(collection[i]);
    

    这告诉我们回调函数应该接受一个参数,该参数是数组中的单个项目。

    [1]:也称为原型,不,不是javascript意义上的“原型”,而是C意义上的“原型”

    【讨论】:

    • 函数过滤器(集合,测试){ var returnAr = [];每个(集合,函数(项目){如果(测试(项目)){returnAr.push(项目)}})返回returnAr; }
    • 感谢 slebetman,您的评论修复了最后一个严重的语法错误。也非常感谢 cdosborn。该死的我的结对编程家伙,他本可以说封装或 f(g(h(x))),我会朝着正确的方向前进。不过我真的不能责怪他,因为他的老板强迫他像他一样做这个程序。
    • 这是一次很好的学习体验。有时只需要一个微不足道的例子就可以给您带来那种 AHA 时刻。
    • 我完全没有意识到每次我使用“回调”时我都需要实现它哈哈。我在这次采访中准备了我的弹药,所以我已经完成了二分搜索、合并排序、链接链接(ok only lol)、树(ok only)但几乎不专注于回调。该死的,作为回报,我知道如何用很少的工具快速拆卸变速箱和/或发动机,而且根本不需要昂贵的工具。与美国相比,马来西亚的日本车非常好。享受那些 JDM 车哈哈
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      each 的签名接受一个类似数组的东西,以及一个用元素调用的函数。

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

      看起来你的回调应该做这个:

          if (test(collection[i])) {
              returnAr.push(collection[i])
          }
      

      请注意,collection[i] 是回调的第一个参数。

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

      function(element) {
          // do stuff
      }
      

      【讨论】:

      • 你的代码和我的一模一样,哈哈。与上面原始邮政编码的正确答案相比,它不起作用。
      • 我不会给你答案,我只是想把你推向它
      • 哈哈。好的。我正在阅读 Eloquent Javascript 高阶函数,希望我能达到你的想法,哈哈。
      • 那本书很棒!每个都替换了 for 循环,因此您必须将测试封装在回调中。过滤器使用回调只是为了获取真假,但每个都会使用回调来改变returnAr
      • 我快到了,我的朋友哈哈。海滩之子,我正在做结对编程的伙伴永远在圈子里。人。你说什么听起来像 f(g(h(x))) 哈哈,对吧?这就是我晚餐的想法
      【解决方案4】:

      如果你真的只想根据你给出的条件过滤数组,这就是你需要的所有代码:

      myArray.filter(function(item) { return item > 2 })
      

      【讨论】:

      • 这个答案在上下文中是不合适的
      • 迈克尔,你必须不理会所有事情,只因为问题出在哪里,才修改过滤器功能的实现。是的,它非常严格,所以你必须和他们一起玩
      • 嗯,你的问题不清楚为什么要实现 EcmaScript 语言已经为你实现的东西。
      • 是的,我知道 ecmascript 有这样的功能。关键是要练习封装。大声笑对不起......他们强迫我理解和使用这种封装的想法
      猜你喜欢
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      相关资源
      最近更新 更多