Array.uniq

「Arrayにuniqってあったけ?」という話をなんとなく聞いていて、実装を考える。

with (Array) {
  prototype.uniq1 = function() {
    var src = this;
    var dest = new Array;
    var buf = src[0];

    for(var i=1; i<=src.length; buf=src[i++]) {
      if(!src[i] || buf != src[i])
        dest.push(buf);
    }

    return dest;
  }

  prototype.uniq2 = function() {
    var src = this;
    var dest = new Array;
    var a, b = src[0];
    var i = 1;

    function next() {
      a = b;
      return (b = src[i++]);
    }

    while(next()) {
      if(a != b)
        dest.push(a);
    }

    dest.push(a);
    return dest;
  }
}

var a = ["A", "a", "a", "a", "b", "c", "c", "D", "d", "d"];

print(a.uniq1());
print(a.uniq2());

関係ないけど、関数内関数のthisはグローバルオブジェクトであることに気付く。