JavaScript配列は一番いい選択をします.
4989 ワード
, method_* ( )
試験環境:バージョン57.0.2987.133(64-bit)var arr1 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 1, 2, 3, 4, 5, 6, "1", "2", "1", "2"];
var arr2 = [1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 1, 2, 3, 4, 5, 6];
while(arr1.length < 600000){
arr1 = arr1.concat(arr1);
arr2 = arr2.concat(arr2);
}
//
//
//
// method_1: - - -push
Array.prototype.unique = function(){
var res = [this[0]],
len = this.length;
for(var i = 1; i < len; i ++){
var repeat = false,
rlen = res.length;
for (var j = 0; j < rlen; j ++){
if(this[i] === res[j]){
repeat = true;
break;
}
}
!repeat && res.push(this[i]);
}
return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 18
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 10
//
//
//
// method_2: - - - -push
Array.prototype.unique = function () {
this.sort(function (a, b) {
if (typeof a != typeof b && a == b) {
if (typeof a == "number") {
return -1;
} else {
return 1
}
}
return parseInt(a) - parseInt(b);
})
var res = [this[0]],
len = this.length;
for (var i = 1; i < len; i ++) {
var slen = res.length;
if (this[i] !== res[slen -1]) {
res.push(this[i]);
}
}
return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 121
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 93
//
//
//
// method_3: - - - - push
Array.prototype.unique = function () {
var res = [],
obj = {},
len = this.length;
for (var i = 0; i < len; i++) {
// 1 "1" , ===
!obj[this[i]] && res.push(this[i]) && (obj[this[i]] = 1);
}
return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 8
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 5
//
//
// method_4: - - - push
Array.prototype.unique = function () {
var res = [],
len = this.length,
i, j;
for (i = 0; i < len; i++) {
for (j = i + 1; j < len; j++) {
if (this[i] === this[j]) {
j = false;
break;
}
}
j && res.push(this[i]);
}
return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 28
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 17
//
//
//
// method_4: Set
Array.prototype.unique = function (){
var arr = new Set(this);
return [...arr];
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 75
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 60
//
//
//
// method_5: find/findIndex/indexOf
Array.prototype.unique = function(){
var res = [this[0]],
len = this.length;
for(var i = 1; i < len; i ++){
var repeat = false,
rlen = res.length;
if(!res.find((v,k)=>{return v === this[i]})){
res.push(this[i]);
}
// if(res.indexOf(this[i]) == -1){
// res.push(this[i]);
// }
// if(res.findIndex((v,k)=>{return v === this[i]}) == -1){
// res.push(this[i]);
// }
}
return res;
}
var timestamp = new Date().getTime();
arr1 = arr1.unique();
console.log(new Date().getTime() - timestamp); // 110+
var timestamp = new Date().getTime();
arr2 = arr2.unique();
console.log(new Date().getTime() - timestamp); // 65+
締め括りをつけるmethod_1時間は
18 /10
であり、循環比較である.method_2時間は
121/93
であり、依存性sort
の並べ替え(文字と数字の組み合わせでsort callback
に依存する)が大幅に増加した場合、既存の配列順序に影響を与える.method_3時間は
8/5
で、文字と数字の区別ができません.method_4時間は
28/7
で、同じmethod_1はサイクルコントラストであるが,内層サイクル数は増加した.method_5時間は
75/60
で、Setデータ構造特性を使用する.method_5時間は
110+/65+
で、find/findIndex/indexOfを用いて判断します.全体的に最適な選択はmethod_です.1
でもおすすめはmethod_です.5----大道からジェーンまで