JS數組去重-JavaScript數組去重方法介紹

JS數組去重,相信大多數前端朋友在面試過程中,遇到過。一般是要求手寫或者大致講一下思路。一旦被面試官問道,講一下數組去重的方法?此時,我們如果可以回答10種或者7、8種,很有可能給我們的面試加分。
但是在項目中,基本上沒有遇見過此類問題。日常項目組遇見的概率比較低,但爲了每年的金三銀四跳槽季,還是有必要掌握以下,以防面試的時候遇到此問題。
下面是整理的數組去重方法,大致有10多種,希望看完能對屏幕前的人朋友們有所幫助。

一、Es6 new Set() 與 … 擴展運算符 方法

 	var arr = [1,'1',true,undefined,null,{},NaN,function a(){},1,'1',true,undefined,null,{},NaN,function a(){}];
    console.log([...new Set(arr )]); 
    // [1, "1", true, undefined, null, {…}, NaN, ƒ, {…}, ƒ]
    // 對象和函數沒有去重

可以看到new Set() 方法代碼簡潔,但是對象和函數不能去重,使用的時候需要注意一下。

二、Es6 new Set() 方法

 	var arr = [1,'1',true,undefined,null,{},NaN,function a(){},1,'1',true,undefined,null,{},NaN,function a(){}];
	function unique (arr) {
	  return Array.from(new Set(arr))
	}
    console.log(unique(arr));
    // [1, "1", true, undefined, null, {…}, NaN, ƒ, {…}, ƒ]  
    // 對象和函數沒有去重

三、Es6 Map數據結構數組去重

	function unique_a(arr) {
	        let map = new Map(),
	            array = [];
	        for (let i = 0, j = arr.length;i < j; i++){
	            var item = arr[i]
	            if(map.has(item)){ // 如果有該 key 值
	                map.set(item, true)
	            } else {
	                map.set(arr[i], false); // 如果沒有該key 值
	                array.push(item)
	            }
	        }
	        return array;
	 }
	 var arr = [1,'1',true,,undefined,null,{},NaN,function a(){},1,'1',true,undefined,null,{},NaN,function a(){}];
	     console.log('map-unique_a', unique_a(arr)) 
	     //  [1, "1", true, undefined, null, {…}, NaN, ƒ, {…}, ƒ]
	     //  對象和函數沒有去重

四、利用對象的屬性去重

function unique_b(arr) {
        if (!Array.isArray(arr)) {
            console.log('數據類型有問題')
            return
        }
        var array = []
        var obj = {}
        for (var i = 0; i < arr.length; i++) {
            if (obj[arr[i]]) {
                // obj[arr[i]]++;
            } else {
                array.push(arr[i])
                console.log(arr[i])
                obj[arr[i]] = 1
            }
        }
        console.log(obj)
        return array
    }

  var arr = [1,'1',true,,'true',undefined,null,{},NaN,function a(){},1,'1',true,,'true',undefined,null,{},NaN,function a(){}];
   console.log('unique_b', unique_b(arr ));
     // [1, true, undefined, null, {…}, NaN, ƒ]
     // 函數和對象、NaN 去重了,但是字符串 'true'和 true,數組 1 和 字符串 ‘1’,只能保留一種,該方法有待改進。

五、使用2層for循環嵌套,然後使用splice去重

	let arr = [1, 1, 'true', 'true', function a() {}, function a() {}, true, true, false, false, null, null, undefined, undefined, NaN, NaN, 0, 0, 'a', 'a', {}, {}]
    function unique_c(arr) {
        for (let i = 0; i < arr.length; i++) {
            var item = arr[i]
            for (let j = i + 1; j < arr.length; j++) {
                var subItem = arr[j]
                // 這裏判斷條件首先是同一類型的數據進行比較,然後用 === 和 JSON.stringify方式比較
                if (Object.prototype.toString.call(item) === Object.prototype.toString.call(subItem) &&
                  (item === subItem || JSON.stringify(item) === JSON.stringify(subItem))) {  
                    arr.splice(j, 1);//第一個等同於第二個,splice方法刪除第二個
                    j--;
                }
            }
        }
    }
    unique_c(arr);
    console.log(arr); 
    // [1, "true", ƒ, true, false, null, undefined, NaN, 0, "a", {…}] 
    // 此方法可以去除任意類型相同的數據

此方法可以去除任意類型相同的數據

六、indexOf 去重

   let arr1 = [1, 1, 'true', 'true', function a() {}, function a() {}, true, true, false, false, null, null, undefined, undefined, NaN, NaN, 0, 0, 'a', 'a', {}, {}]
    function unique_d(arr) {
        if (!Array.isArray(arr)) {
            console.log('params 參數錯誤')
            return
        }
        var newArr = []
        for (var i = 0; i < arr.length; i++) {
            var item = arr[i]
            if (newArr.indexOf(item) === -1) {
                newArr.push(item)
            }
        }
        return newArr
    }

    console.log('unique_d', unique_d(arr1))
	// [1, "true", ƒ, ƒ, true, false, null, undefined, NaN, NaN, 0, "a", {…}, {…}]
	// 此函數對函數、NaN 、對象不能去重

七、利用sort排序

	var arr= [1, 2, 3, 1, 'false', true, NaN, null, function a(){},function a(){},undefined, { name: 1 }, 1, 2, 3, 1, 'false', true, NaN, null, undefined, { name: 1 }];
    function unique_e(arr) {
        if (!Array.isArray(arr)) {
            console.log('params 參數錯誤')
            return
        }
        arr = arr.sort();
        var newArr = [arr[0]];
        for (var i = 1, j = arr.length; i < j; i++) {
            var item = arr[i],
              	prevItem = arr[i - 1]
            if (item !== prevItem) {
                newArr.push(item)
            }
        }
        return newArr;
    }
    console.log('unique_e', unique_e(arr));
    // [1, 2, 3, NaN, NaN, {…}, {…}, "false", ƒ, ƒ, null, true, undefined]

此方法不能對NaN 、對象、函數去重,改變一下判斷條件即可實現全部類型去重。使用上面第種方法裏面的判斷條件即可。

八、利用 ES6 includes

	var arr= [1, 2, 3, 1, 'false', true, NaN, null, function a(){},function a(){},undefined, { name: 1 }, 1, 2, 3, 1, 'false', true, NaN, null, undefined, { name: 1 }]
	function unique_f(arr) {
        if (!Array.isArray(arr)) {
            console.log('數據類型有問題')
            return
        }
        var newArray = []
        for (var i = 0, j = arr.length; i < j; i++) {
            var item = arr[i]
            if (!newArray.includes(item)) {
                newArray.push(item)
            }
        }
        return newArray
    }

    console.log('unique_f', unique_f(list))
    // [1, 2, 3, NaN, {…}, {…}, "false", ƒ, ƒ, null, true, undefined]

對象和函數不能實現去重,使用時需要注意。

九、使用對象 hasOwnProperty 方法

var arr =var arr = [function a(){},{nameaa:222},1,1,'true','true',true,true,15,15,function a(){}, function b(){alert(222)},false,false, undefined,undefined, null,null, NaN, NaN,'NaN', 0, 0, 'a', 'a',{name:1},{name:222}];;
	function unique_g(arr) {
	    var obj = {};`在這裏插入代碼片`
	    return arr.filter(function(item, index, arr){
	        return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
	    })
	}
    console.log(unique(arr))
    // [ƒ, {…}, 1, "true", true, 15, ƒ, false, undefined, null, NaN, "NaN", 0, "a"]

此方法對,只要數組裏麪包含對象就給去除掉,做不到準確去重。使用時注意一下。

十、使用 filter 去重

var arr = [1, 1, true, true, 'true', 'true',function a(){},function b(){},,function a(){}, 15, 15, false, false, undefined, undefined, null, null, '', '', NaN, NaN, 'NaN', 0, 0, 'a', 'a', { name: 1 }, { name: 1 }]
 function unique_h(arr) {
     return arr.filter(function(item, index) {
        return arr.indexOf(item, 0) === index
    })
 }

console.log('unique_h', unique_h(arr)) // 對象、函數沒有去重

十一、利用遞歸去重

	var arr = [1, 1, undefined,undefined,true, true, 'true', 'true',function a(){},function b(){},,function a(){}, 15, 15, false, false,   null, null, '', '', NaN, NaN, 'NaN', 0, 0, 'a', 'a', { name: 1 }, { name: 1 }]
	function unique_i(arr) {
        var array = arr,
        	len = array.length
        array.sort(function(a, b) {   //排序後更加方便去重
            return a - b
        })
        function loop(index) {
            if (index >= 1) {
                if (array[index] === array[index - 1]) {
                    array.splice(index, 1)
                }
                loop(index - 1)    //遞歸loop,然後數組去重
            }
        }
        loop(len - 1)
        return array;
    }
    console.log('unique_i', unique_i(arr));
    // [1, true, "true", ƒ, ƒ, ƒ, false, null, "", 0, 15, NaN, NaN, "NaN", "a", {…}, {…}, undefined]

對函數、NaN、對象同樣是沒有去重,並且對 undefined 處理有異常。有時間在仔細研究一下。

十二、使用 reduce+includes

	var arr = [1, 1, undefined,undefined,true, true, 'true', 'true',function a(){},function b(){},,function a(){}, 15, 15, false, false,   null, null, '', '', NaN, NaN, 'NaN', 0, 0, 'a', 'a', { name: 1 }, { name: 1 }]
	function unique_j(arr) {
         return arr.reduce((prev, current) => {
             return prev.includes(current)?prev: [...prev, current]
        }, [])
     }
     console.log('unique_j',unique_j(arr )); 
     // [1, undefined, true, "true", ƒ, ƒ, ƒ, 15, false, null, "", NaN, "NaN", 0, "a", {…}, {…}]

對函數、對象沒有去重。

以上就是整理的方法,有錯誤的地方還希望大家指出來,如果還有其他方法,請多多指教。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章