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...