【前端筆試題】陣列去重
阿新 • • 發佈:2019-01-10
陣列去重
題目來自於自己真實筆試,現在總結到博文,算是給自己的再一次複習吧,另外也可以與大家分享。
最初的實現
我記得我第一次的答案是這樣寫的:
for (var i = 0; i < arr1.length; i++) {
for (var j = i+1; j < arr1.length; j++) { // 從第i+1個元素遍歷陣列
// 如果當前陣列元素相同
if (arr1[i] == arr1[j]) {
arr2.push(arr1[j]); // 把相同的元素push到陣列arr2中
arr1.splice(j,1 ); // 並刪除更新原陣列arr1
}
}
}
然後測試是這樣:
var arr1 = [1,2,3,4,2,5,6,1,7,8,4];
var arr2 = [];
//測試
document.write('去重陣列:' + arr1 + " 重複項:" + arr2);
//結果: 去重陣列:1,2,3,4,5,6,7,8 重複項:1,2,4
雖然思想結果都是對的,但是我當時真的只是為作答而作答,並沒有想著去完善一個去重的功能,去分析它的效能。後來學習到原型prototype這個知識點,然後改進了下方法。將方法寫在陣列的原型上,這樣就可以直接呼叫去重方法,實習去重,另外也會去在寫每一個方法時去考慮它的效能。
去重方法1:
/**
* [unique1 陣列去重方法1]
*
* 利用array indexOf
* @return {[Array]} [去重後的陣列]
*/
Array.prototype.unique1 = function()
{
var temp = []; // 一個新的臨時陣列
for(var i = 0; i < this.length; i++) // 遍歷當前陣列
{
//判斷是否臨時陣列中有該遍歷的元素存在
if (temp.indexOf(this[i]) == -1 ) {
temp.push(this[i]); // 若不存在,則push到臨時數組裡面
}
}
return n;
}
去重方法2:
/**
* [unique2 陣列去重方法2]
*
* 利用array indexOf
* @return {[Array]} [去重後的陣列]
*/
Array.prototype.unique2 = function()
{
var temp = [this[0]]; // 把陣列首個元素存入臨時陣列
for(var i = 1; i < this.length; i++) //從陣列元素第2個開始遍歷
{
//判斷第i項元素是否在臨時陣列中第一次出現的位置是i,
if (this.indexOf(this[i]) == i) { // 如果不是i,表示是重複項
n.push(this[i]); // 如果是i,就push元素到臨時陣列中
}
}
return n;
}
去重方法3:
/**
* [unique3 陣列去重方法3]
*
* 利用array sort方法先排序
* @return {[Array]} [去重後的陣列]
*/
Array.prototype.unique1 = function() {
this.sort(); // 進行基礎排序
var temp = [this[0]]; // 將陣列第1個元素存入臨時陣列中
for(var i = 1; i < this.length; i ++) { // 從陣列第2個元素遍歷陣列
// 判斷遍歷的元素和臨時陣列最後一個元素是否相同,
if (this[i] !== temp[temp.length-1]) {
temp.push(this[i]); // 如果不相同,那就push到臨時陣列
}
}
return temp; // 返回臨時陣列
}
測試:
var arr = [1,2,3,4,2,5,6,1,7,8,4];
// 方法1
document.write('去重陣列:' + arr.unique1()); // 去重陣列:1,2,3,4,5,6,7,8
// 方法2
document.write('去重陣列:' + arr.unique2()); // 去重陣列:1,2,3,4,5,6,7,8
// 方法2
document.write('去重陣列:' + arr.unique3()); // 去重陣列:1,2,3,4,5,6,7,8
結果都是一樣的,但是從效能來說,第三種方法效率要高於前兩種,因為前兩種方法使用的indexOf(),要去把整個陣列所有元素搜尋一遍,如果遇到很長的陣列,效率可想而知很不理想,而第三種是先進行基礎排序,然後再去比較兩個元素,不需要把整個陣列搜尋一遍,所以執行效率要更好。
當然陣列去重的方法很多,我只是舉例出其中的三個,很樂意其他朋友分享交流指正
咳咳,還是那句話
還是要不斷學習的,因為自己還很年輕