1. 程式人生 > >【前端筆試題】陣列去重

【前端筆試題】陣列去重

陣列去重

題目來自於自己真實筆試,現在總結到博文,算是給自己的再一次複習吧,另外也可以與大家分享。

最初的實現

我記得我第一次的答案是這樣寫的:

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(),要去把整個陣列所有元素搜尋一遍,如果遇到很長的陣列,效率可想而知很不理想,而第三種是先進行基礎排序,然後再去比較兩個元素,不需要把整個陣列搜尋一遍,所以執行效率要更好。

當然陣列去重的方法很多,我只是舉例出其中的三個,很樂意其他朋友分享交流指正

咳咳,還是那句話

還是要不斷學習的,因為自己還很年輕