代码之家  ›  专栏  ›  技术社区  ›  Musixauce3000

有没有一种简单的方法可以快速将给定数组的全部内容传递到“array”中。原型方法变量不使用参数?

  •  0
  • Musixauce3000  · 技术社区  · 8 年前

    我创建了一个数组 docket 在用户单击画布空间时跟踪坐标。在主程序循环期间,通过绘图功能扫描阵列,以便可以看到选定的像素。最初,在我的事件侦听器中,我使用 push( ) 方法,但后来我意识到我想要一种切换像素的方法。

    poke( ) Array.prototype ,如下所示,这允许我推动整个 摘要 param.array 并将触发坐标分配给局部变量 param.entry . entry array 由主处理 戳() 返回顶部,最终缩小 1;如果没有找到匹配项,则不会消除任何元素 参数。大堆 1。

    主要问题:示例1

    无论如何,由于该方法当前已编写,因此必须调用它:

    docket.poke( docket, e.key ); 注意:为了简单起见,我使用了键盘键值。

    Array.prototype.poke = function( a, b ) {
      var bool = {  },  i = {  },  param = {  };
      param.array = a;  param.entry = b;    
      //
      param.array.push( param.entry );
      i.len = param.array.length;
      i.end = i.len - 1;
      //
      for ( i.cur = 0; i.cur < i.len; i.cur++ ) {
        bool.match = param.array[ i.cur ] == param.array[ i.end ];
        bool.nSelf = !( i.cur == i.end );
        //
        if ( bool.match && bool.nSelf ) {
          param.array.splice( i.end, 1 );
          param.array.splice( i.cur, 1 );
          //
          i.end -= 2;
          i.len -= 2;
        }
      }
      //
      return param.array;
    }
    

    到局部数组进行处理,然后将结果明显返回到顶部,我认为这对理解非常有帮助。其次,这个例子和下一个例子都使用了一种令人困惑的真实性测试来过滤重复值检测中的误报。但这个例子没有太多。它可以很容易地重写以比较 参数。大堆 使用紧密、无意义的for循环。

    主要问题:示例2

    docket.poke( e.key );

    Array.prototype.poke = function( a ) {
      var bool = {  },  entry = a,  i = {  };
      //
      this.push( entry );
      i.len = this.length;
      i.end = i.len - 1;
      //
      for ( i.cur = 0; i.cur < i.len; i.cur++ ) {
        bool.match = this[ i.cur ] == this[ i.end ];
        bool.nSelf = !( i.cur == i.end );
        //
        if ( bool.match && bool.nSelf ) {
          this.splice( i.end, 1 );
          this.splice( i.cur, 1 );
          //
          i.end -= 2;
          i.len -= 2;
        }
      }
    }
    

    如您所见,这消除了调用中的冗余,但牺牲了方法的一些可读性,更重要的是,牺牲了使用我上面提到的简单比较来真正精简代码的机会。

    所以现在我想知道是否有一种不太明显的方法我错过了,它允许我将数组的全部内容传递给局部变量,而不必首先将它们作为自己方法的参数传递。

    有什么想法吗?

    1 回复  |  直到 8 年前
        1
  •  2
  •   trincot    8 年前

    如果要将数组作为参数传递,则没有理由在原型上定义方法。一个普通函数就可以了。

    但是,如果满足以下条件,则可以简化代码:

    • 您只需添加元素 您已确定它尚未在阵列中出现
    • 你会使用 indexOf

    Array.prototype.toggle = function(value) {
        var index = this.indexOf(value);
        if (index > -1) {
            this.splice(index, 1);
        } else {
            this.push(value);
        }
    }
    
    var a = [4,2,5,8];
    a.toggle(2);
    console.log(a.join());
    a.toggle(2);
    console.log(a.join());

    NB:我个人觉得这个名字 toggle 更有说服力 poke

    Set :它将在恒定时间内找到现有成员(而阵列实现需要线性时间),并能够在恒定时间内删除它。因此,如果您愿意为此使用数组以外的其他东西,请选择 设置 .

    Set.prototype.toggle = function(value) {
        if (!this.delete(value)) this.add(value);
    }
    
    var a = new Set([4,2,5,8]);
    a.toggle(2);
    console.log([...a].join());
    a.toggle(2);
    console.log([...a].join());