◆ Array.prototype.unique = function(){return [...new Set(this)]}

ES6 でも配列の重複削除のメソッドってできなかったですよね

なにかいい方法ができてないか調べても filter のやり方をアロー関数に置き換えただけみたいなものしか見当たらなかったです
軽くしか調べてないですけど


ですが filter を使う方法って短く書けてはいますが 明らかに配列が大きくなると遅いですよね

なので 私は Set が使えるようになってからはずっと Set を使っています
Set は集合なので重複が許されません
また JavaScript の Set は登録順が保証されます
また Array.from や spread operator (...) で配列へ変換することができます

Set の内部処理まではしらないですが 普通にオブジェクトのようなハッシュで管理されてると思います
それなら Set に変換→Array に戻す としたときに 2 回の走査と各要素一回のハッシュ計算で済むはずです
しかも 2 回目は重複するのは除かれているのでほとんどの場合は 1回目の走査より量が減るはずです


ためしてみるのが早いのでやってみます
環境はいつもの Chrome
バージョンは 51 です
Array.prototype.uni1 = function(){
return [...new Set(this)]
}

Array.prototype.uni2 = function(){
return this.filter((e, i, a) => {
return a.indexOf(e) === i
})
}

var arr = Array.from(Array(50000), e => ~~(Math.random() * 10000))

var r = null
for(var i=0;i<5;i++){
console.log("Set")
console.time(1)
r = arr.uni1()
console.timeEnd(1)
console.log(r.length)
console.log("")

console.log("filter")
console.time(2)
r = arr.uni2()
console.timeEnd(2)
console.log(r.length)
console.log("=============")
}

uni1 と uni2 というメソッドを作りました
1 が Set で 2 が filter です

5 万要素の配列で要素は 0 ~ 9999 のランダムな値にします
JavaScript はブレが大きいのでとりあえず 5 回交互に実行してみます
Set
1: 50.000ms
9948

filter
2: 389.000ms
9948
=============
Set
1: 22.000ms
9948

filter
2: 332.000ms
9948
=============
Set
1: 14.000ms
9948

filter
2: 338.000ms
9948
=============
Set
1: 14.000ms
9948

filter
2: 321.000ms
9948
=============
Set
1: 14.000ms
9948

filter
2: 326.000ms
9948
=============

明らかに Set のほうが早い結果です


重複が少ないと filter 内の毎回の走査が配列の最後までしないといけなくて遅くなると思います
ランダムな要素を 0~99999 にして重複しないものを増やしてみました
Set
1: 45.000ms
39355

filter
2: 997.000ms
39355
=============
Set
1: 19.000ms
39355

filter
2: 891.000ms
39355
=============
Set
1: 21.000ms
39355

filter
2: 861.000ms
39355
=============
Set
1: 17.000ms
39355

filter
2: 852.000ms
39355
=============
Set
1: 17.000ms
39355

filter
2: 851.000ms
39355
=============

かなり遅くなっていますね
Set の方は増えていますが ちょっとだけです


ということなので ユニークには
Array.prototype.unique = function(){
return [...new Set(this)]
}

を使うのがよさそうです

こっちのほうが文字数も少ないですしね