JS實用功能 9 面試中常遇見的陣列去重

2022-03-25 13:42:58 字數 3975 閱讀 7409

js陣列去重是面試中並不少見的問題,聽起來很簡單,當你興高采烈地回答了你的方法之後,你以為這道題就結束了嗎?no,一般來說,面試官會繼續問你「除了你剛剛說的方法,還有其他更好的方法嗎?」,這時的你就需要了解多幾種js陣列去重的方法了。

下面我們先來看看常見的去重方法先吧。

拿前乙個資料和後面的資料做對比,與後面相同的就刪除。

//

方法1const unique = arr =>

for(let i = 0; i < arr.length; i++)

}}

return

arr;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

在結果中可以看出,部分相同的資料都已經被去掉了,但是true、nan、{}這三個是沒有去除的。應該是「==」判斷的問題。

可以來看看nan的情況:

兩個nan對比,居然是個false,難怪沒有去重成功。其他應該也是相對如此的,那麼這種去重方法還是存在不足的。

遍歷原陣列,將每個元素插入到新陣列中。插入前先判斷新陣列中是否存在改元素。利用陣列的indexof方法來查重,有就返回元素在陣列中的下標,不存在就返回-1.

const unique = arr =>

} return

arr1;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
輸出結果:

看來這個對true去重有作用了呀,但是nan、{}還是不起作用。

三、單個for迴圈和includes

這個跟第二個差不多,不同的是重複判斷用的是陣列的includes方法,它返回是boolean型別,如果包含某個元素就返回true,反正false。

const unique = arr =>

} return

arr1;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
輸出結果:

這次比前兩次好了很多,能判斷nan了。

先用sort方法對陣列進行排序,然後對比相鄰兩個元素是否相等,做去重處理。

const unique = arr =>

} return

arr1;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

效果還是很好的嘛。

set集合作為es6新加入的資料結構,儲存類似於陣列,但是裡面的元素是不能重複的。我們可以先將陣列轉成set集合,去重之後,再轉為陣列輸出。

const unique = arr =>
array.from()方法就是將乙個類陣列物件或者可遍歷物件轉換成乙個真正的陣列,不過它也是es6的新特性。

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

看來效果還是很不錯的啊,除了 {} 不能去重外,其他都完成了。

filter()會建立乙個新陣列,迴圈對陣列中的元素呼叫callback函式, 如果返回true 保留,如果返回false 過濾掉,  返回新陣列,老陣列不變。

const unique = arr =>);

}

測資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

這個方法也是除了 {} 無法去重外,其他都可以成功了。

map作為es6的一種新型資料結構,類似json,用鍵值對方式儲存資料。map中有has()方法,返回乙個boolean型別,來表明map中是否存在指定元素。

const unique = arr =>

else

} return

arr1;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

也是除了{}去不了重之外,其他都正常。

這種方法其實跟第一種方法差不多,通過迴圈判斷前乙個元素和後面元素是否相同來查重。不過要求掌握遞迴演算法的。

const unique = arr =>

loop(index - 1); //

遞迴loop,然後陣列去重

} }

loop(len-1);

return

arr1;

}

測試資料:

let arr = [1,1,false,false,true,true,null,null,undefined,undefined,nan,nan,{},{},'a','a'];
測試結果:

處理nan和{}無法去重外,其他都沒問題。

上面的方法都能解決日常開發中的大部分去重問題,但都不能解決 {} 去重問題,難道就真的沒辦法了嗎?

物件是永不相等的,在用 === 號的情況下,因為它們屬於引用型別,在三等符號的情況下判斷是記憶體位址了,當且僅當它們引用同乙個基物件時,它們才相等。

其實可以將物件轉換成字串,然後讓字串對比,就可以做到去重的效果。

const unique = arr =>
測試資料1:

let json = [{},{}];
測試結果1:

測試資料2:

let json2 = [, ];
測試結果2:

通過上面的方法也就很好的解決了 物件 相等的問題,其實知道原理之後,用for迴圈也是可以解決的,但是,最近在學es6,順便裝一下13。

上面就是這篇的全部內容了。

js實用功能 防抖

var oinp document.getelementsbytagname input 0 封裝乙個防抖函式 function debouns handler,delay delay function ajax oinp.oninput debouns ajax,1000 html部分就是乙個in...

位操作的實用功能

位操作雖然會降低程式的可讀性,但是我想,熱衷於位操作的人大概都是被它的效率所吸引了。如果某些簡單但常用的功能可以利用位操作實現,且用位操作實現的 量相同或更少,我希望讓這些位操作得到普及。在介紹之前,先列舉一下位操作符 a b 按位與 a b 按位或 a b 按位異或 a 按位取反 aa b 有符號...

IOS實用功能 定位裝置的使用

viewcontroller.swift dome2test created by 郭文亮 on 2018 11 22.import uikit 匯入定位框架 全球衛星定位 蜂窩基站 無線網路定位 import corelocation 新增乙個地理定位的 協議cllocationmanagerde...