1. 程式人生 > >前端面試系列之陣列去重

前端面試系列之陣列去重

1. 雙迴圈去重

原理: 定義一個包含原始陣列第一個元素的陣列,然後遍歷原始陣列,對原始陣列進行遍歷,將原始陣列中的每一個元素與新陣列中的每一個元素進行對比,如果不重複就新增到新數組裡,最後返回新陣列。這種方式很耗費時間喝記憶體,不適合大型陣列。


   // 雙重迴圈去重,原理: 先定義一個包含原始陣列的第一個元素的新陣列,記住這裡是新陣列,然後進行兩次迴圈,把新陣列和原始陣列進行對比,為啥要進行兩次迴圈呢,寫著寫著的時候,你發現,你如果只迴圈一次呢,你沒辦法對比兩個陣列哇。 
    function  unrepeat(arr) {
        // body...
        if (!Array.isArray(arr)) {
            console.log('type err');
            return;
        }
        let newArr = [arr[0]];
        for (let i = 1; i< arr.length; i++) {
            let flag = true;
            // 這是你迴圈的第一次,你在這裡能夠拿到傳入的陣列的每一個值。接下來你要做的就是把這個迴圈的每一個值和另一個迴圈的每一個值進行對比,執行的順序是,第一個迴圈先給你一個餅,然後你去第二個裡拿出來每一個,對比這些裡面和第一個有沒有不同的地方。第二個對比完,在拋給你一個,依次類推。
            for(let j = 0; j<newarr.length; j="" ++)="" {="" 這裡是對你要存的不重複的陣列元素陣列的迴圈="" ,為啥裡面要有一個了呢,那是因為啊,它是老大哇,就算有重複也是後面的問題。="" if(arr[i]="==newArr[j])" flag="false;" break;="" }="" if="" (flag)="" newarr.push(arr[i])="" return="" newarr;="" <="" code="" style="-webkit-print-color-adjust: exact;">
#### let 和var 的區別: 1.作用域不同,let 和cost 都是塊級作用域,而var是全域性作用域。 #### 2.使用let 定義的是常量,在同一作用域,再次賦值,就會報錯。使用var 的情況下,後執行的會替換掉先執行的。 #### 3.宣告一個變數,但是未賦值的情況下,輸出都是undefined,但是使用let宣告但是沒有賦值的,就會報錯,而使用var的只是輸出了undefined,let 相對於var 有著更嚴格的語法檢查。 ### 2. indexOf 方法去重1

陣列的indexof方法可以返回某個指定的元素在陣列中首次出現的位置,該方法首先丁酉一個空陣列,然後呼叫indexof 對原陣列進行遍歷判斷,如果元素不在res中,則將其push放進去,最後將新陣列返回


function unquite (arr) {
    if(!Array.isArray(arr)) {
        console.log('type err')
    }
    let newArr = [];
    for (let i = 0; i< arr.length; i++) {
        if(newArr.indexOf(arr[i]) ===-1)) {
            newArr.push(arr[i])
        }
    }
    return newArr;
}

### 3.indexOf 之2

利用indexOf檢測元素在陣列中第一次出現的位置是否和元素現在的位置相等,如果不等則說明該元素是重複元素


function unique (arr) {
    if (!Array.isArray(arr)) {
        console.log('type error');
        return;
    }
    return Array.prototype.filter.call(arr,function(item,index){
      return arr.indexOf(item) === index;
    })
}

4. 相鄰元素去重

這種方法首先呼叫了陣列的排序方法,sort() ,然後根據排序後的結果進行遍歷及相鄰元素進行比對,如果相等則跳過改元素,直到遍歷結束。


  function unquire (arr){
    if(!Array.isARRAY(arr)) {
       console.log("type err")
    }
    arr = arr.sort()
    let res = [arr[0]]
    for(let i = 1; i<arr.length; i++){="" if(arr[i]="" !="=arr[i-1])" {="" }="" <="" code="" style="-webkit-print-color-adjust: exact;">

5. 利用物件屬性去重

建立空物件,遍歷陣列,將陣列中的值設為物件的屬性,並給該屬性賦初始值為1,每出現一次,對應的屬性值增加1,這樣,屬性對應的就是該元素出現的次數了


function unquite (arr) {
    if(!Array.isArray(arr)) {
        console.log('tyoe err')
        return;
    }
    let res = [],
         obj = {};
    for(let i = 0; i<arr.length; i++)="" {="" if(!obj[arr[i]]){="" res.push(arr[i])="" obj[arr[i]]="1" }="" else="" ++="" return="" res;="" <="" code="" style="-webkit-print-color-adjust: exact;">

6.set 與解構賦值去重

es6中新增了資料型別set,set的一個最大的特點就是資料不重複。set函式可以接受一個數組作為引數來初始化,利用該特性也能做到陣列去重。


  function unique (arr){
     if(!Array.isArray(arr)) {
       console.log('type error');
       return;
     }
     return [...new Set(arr)]
  }

7. Array.form 與set 去重

Array.form 方法可以將結構轉換為陣列結果,而我們知道set結果是不重複的資料集,因此能夠達到去重的目的


  function unique (arr){
       if (!Array.isArray(arr)) {
        console.log('type error!')
        return
    }
    return Array.form(new Set(arr))
  }

本文為總結面試題,看的是別人發的方法。