1、Es6提供的方法
<script type="text/javascript">
//ES6里新添加了兩個方法,set(set是一種新的數據結構,它可以接收一個數組或者是類數組對象,自動去重其中的重復項目)
//Array.from(類數組對象、可迭代對象轉化為數組)。
var arr = [1, 2, 3, 2, 4, 5, 5, null, null, undefined, undefined, NaN, NaN] const item = new Set(arr); const newArr = Array.from(item); console.log(newArr, '去重后的數組')//[1, 2, 3, 4, 5, null, undefined, NaN] "去重后的數組"
const arr1 = [1,1,2,3,4,4,3,5,5,5,6,7,8,8]; console.log(noRepeat(arr1,'去重后'))//[1, 2, 3, 4, 5, 6, 7, 8]
//ES6方法去重封裝(目前主流的瀏覽器,Chrome,Firfox,Opera,Safari,包括微軟的Edge,都是支持的,唯獨IE系列不支持,所以慎用 )
function noRepeat(arr) { return Array.from(new Set(arr)); } </script>
<script type="text/javascript">
var arr = [NaN,NaN,undefined,undefined,false,false,true,true,1,1,2,3,4,5,33,33,4,5,6]; arr = [...new Set(arr)]; console.log(arr,'去重后');//[NaN, undefined, false, true, 1, 2, 3, 4, 5, 33, 6] "去重后"
</script>
2.下標查詢(通常簡單做法)
<script type="text/javascript">
//(普通做法)
const list = [1,2,3,4,5,3,4,5,3,6]; console.log(noRepeat(list),'去重后');//[1, 2, 3, 4, 5, 6] "去重后"
//ie8以下不支持indexOf()方法
function noRepeat(arr) { var newArr = []; for(var i = 0; i < arr.length; i++) { if(newArr.indexOf(arr[i]) == -1) { newArr.push(arr[i]); } } return newArr; } </script>
<script type="text/javascript">
//下標檢索 //實現思路:如果當前數組的第i項在當前數組中第一次出現的位置不是i, //那么表示第i項是重復的,忽略掉。否則存入結果數組。 function noRepeat(arr) { var temp = []; for(var i = 0; i < arr.length; i++) { //如果當前數組的第i項在當前數組中第一次出現的位置是i,才存入數組;否則代表是重復的 if(arr.indexOf(arr[i]) == i) { temp.push(arr[i]) } } return temp; } var list = [1,2,3,33,33,2,3,2,3,4,6,7,9]; console.log(noRepeat(list),'去重后');//[1, 2, 3, 33, 4, 6, 7, 9] 去重后 </script>
3.用對象屬性去重
<script type="text/javascript">
//每次取出原數組的元素,然后再對象中訪問這個屬性,如果存在就說明重復;
var arr = [1, 2, 3, 3, '1', '1', '去掉', '去掉', NaN, NaN, false, false]; var obj = {}; var temp = []; for(var i = 0; i < arr.length; i++) { var type = Object.prototype.toString.call(arr[i]); //加類型判斷數據類型 如區分 1 '1'
if(!obj[arr[i] + type]) { temp.push(arr[i]); obj[arr[i] + type] = true; //這里給true利於代碼閱讀和判斷,如果給 0,'' ,false ,undefined 都會在if那里判斷為 false不利於代碼閱讀
} } console.log(temp, '去重') //[1, 2, 3, "1", "去掉", NaN, false] "去重"
</script>
<script type="text/javascript">
//封裝一下;
function noRepeat(arr) { var newArr = []; var obj = {}; for(var i = 0; i < arr.length; i++) { var type = Object.prototype.toString.call(arr[i]); //加類型判斷數據類型 如區分 1 '1'
if(!obj[arr[i] + type]) { newArr.push(arr[i]); obj[arr[i] + type] = true; //這里給true利於代碼閱讀和判斷,如果給 0,'' ,false ,undefined 都會在if那里判斷為 false不利於代碼閱讀
} } return newArr; } var list = [1, 2, 2, 3, 4, '3', '3', NaN, NaN, false, false, true, true]; console.log(noRepeat(list), '去重后')//[1, 2, 3, 4, "3", NaN, false, true] "去重后"
</script>
4.先排序再去重
<script type="text/javascript">
var list = [1, 2, 3, 3, '0', '0', '2', '測試', '測試', NaN, NaN, false, false]; function noRepeat(arr) { arr.sort(); var temp = []; while(arr.length > 0) { if(Object.is(arr[0], arr[1])) { //Object.is() 用於比較2個值, 比===更靠譜 例如 Object.is(NaN,NaN) 會判斷true
arr.shift(); } else { temp.push(arr.shift()); } } //此方法會清空原數組,可以復制一個數組,再進行操作
return temp } console.log(noRepeat(list), '去重后')//["0", 1, 2, "2", 3, NaN, false, "測試"] "去重后"
</script>
5.for in + array.includes(ES6判斷)
<script type="text/javascript">
var arr = [1,3, 3, '1', '1', '1','重復', '重復', NaN, NaN, false, false,undefined,undefined]; function noRepeat(arr) { var temp = []; for(var i = 0; i < arr.length; i++) { if(!temp.includes(arr[i])) { //includes檢測數組是否有某個值 內部調用Object.is()利用判斷NaN
temp.push(arr[i]); } } return temp } console.log(noRepeat(arr), '去重后'); //[1, 3, "1", "重復", NaN, false, undefined] "去重后"
</script>
