數組值只包含了字符和數字,更多類型增長不會影響如下method_*的排序(時間排序)
javascript
測試環境:版本 57.0.2987.133 (64-bit)java
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爲循環對比,可是增長了內層循環次數。this
method_5時間爲 75/60
, 使用Set數據結構特性。prototype
method_5時間爲 110+/65+
, 使用find/findIndex/indexOf判斷。code
整體來講最佳選擇爲 method_1 對象
可是推薦使用method_5----大道至簡排序