【问题标题】:array.filter code explanation [closed]array.filter 代码解释
【发布时间】:2013-12-25 01:04:24
【问题描述】:

你能解释一下下面的代码会做什么吗?

shapes = shapes.filter( function (current) {
    if(current.id == dragID ) {
        drag = current;
        return false;
    }               
    return true;
} );

shapes 是一个保存对象的数组。

【问题讨论】:

    标签: javascript filter


    【解决方案1】:

    正如函数名所暗示的,它过滤掉 id 等于 dragID 的形状。此外,它将 id = dragID 的形状设置为drag

    因此,如果您有 id [1,2,3,4,5] 和 dragID 3 的形状,该函数将返回 id 为 [1,2,4,5] 的形状,并将drag 设置为 id 的形状3.

    【讨论】:

      【解决方案2】:

      这是.splice() 的低效实现。想象一下形状是这样的:

      [0, 1, 2, 3, 4]

      运行此代码后,如果“2”处的项目与 dragID 匹配,您最终会得到:

      drag = 2
      shapes = [0, 1, 3, 4]
      

      这段代码来自哪里?可能应该通知作者,最好写成:

      var drag;
      for(var i = shapes.length - 1; i >= 0 && shapes[i].id != dragID; i--)
      {}
      
      if (i >= 0)
          drag = shapes.splice(i, 1);
      

      如果 Array.findIndex 有一个 polyfill,或者页面上有 sugarjs,它可能会更短(通过使用 findIndex)。

      【讨论】:

        【解决方案3】:

        查看此代码

        shapes.filter(function(current) {
         ...
        })
        

        作为foreach 循环。如果函数(当前)返回false 循环停止。 例如:

        for(i=0;i<shapes.length;i++) {
         if(shapes[i].id == dragID) {
          drag = shapes[i].id;
          break;
         }
        }
        

        【讨论】:

        • 为什么filter 会停在false 上?
        猜你喜欢
        • 1970-01-01
        • 2015-03-23
        • 2012-07-20
        • 2010-10-11
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多