7种数组去重方法

一、设定原数组

 const arr = [22, 22, 'ture', 'ture', false, false, undefined, undefined, null, null, NaN, NaN, 'NaN', 0, 0, 'a', 'a', 15, 15, true, true, {}, {}]
 console.log('原数组', arr);

二、去重方法

1.ES6的set去重  Array.from(new Set(数组)) ,无法去空对象{},可以去NaN

        function unique() {
            return Array.from(new Set(arr))
        }
//  Array.from 浅拷贝出一个新的数组
        console.log('set去重', unique());

2.双重循环嵌套,使用spilce,无法去空对象{}和NaN

        function unique1(arr) {
            for (let i = 0; i < arr.length; i++) {
                for (let j = i + 1; j < arr.length; j++) {
                    if (arr[i] === arr[j]) {
                        arr.splice(j, 1)
                        j--
                    }
                }
            }
            return arr
        }
        console.log('双重循环splice去重', unique1(arr));

3.indexOf去重,无法去NaN,使用的是严格相等,故NaN === NaN 是false

        function unique2(arr) {
            if (!Array.isArray(arr)) {
                return console.log('传入的不是数组');
            }
            let newArr = []
            for (let i = 0; i < arr.length; i++) {
                if (newArr.indexOf(arr[i] === -1))//如果newArr数组中没有,则添加
                {
                    newArr.push(arr[i])
                }
            }
            return newArr
        }
        console.log('indexOf去重', unique2(arr));

4.利用sort()去重,无法去重{}对象,NaN,undefined消失

        function unique3(arr) {
            if (!Array.isArray(arr)) {
                return console.log('传入的不是数组');
            }
            arr = arr.sort()
            let newArr = [arr[0]]
            for (let i = 1; i < arr.length; i++) {
                if (arr[i] !== arr[i + 1]) {
                    newArr.push(arr[i])
                }
            }
            return newArr
        }
        console.log('sort去重', unique3(arr));

5.利用includes,即数组是否包含该值,使用的是SameValueZero算法,此算法认为NaN === NaN是true

        function unique4(arr) {
            if (!Array.isArray(arr)) {
                return console.log('传入的不是数组');
            }
            let newArr = []
            for (let i = 0; i < arr.length; i++) {
                if (!newArr.includes(arr[i])) {
                    newArr.push(arr[i])
                }
            }
            return newArr
        }
        console.log('includes去重', unique4(arr));

6.hasOwnProperty,检测对象是否包含某个值,可全部去重

        function unique5(arr) {
            let obj = {}
            function f1(item, index, arr) {
                return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
            }
            return arr.filter(f1)
        }
        console.log('对象的hasOwnProperty去重', unique5(arr));

7.利用filter+indexOf,无法去重{},NaN消失

        function unique6(arr) {
            if (!Array.isArray(arr)) {
                return '传入的不是数组'
            }
            //利用filter返回一个新的数组,新数组的元素为符合函数标准的元素,需要return
            return arr.filter(function (item, index, arr) {
                //从数组的第0位开始查找目标元素,如果与当前索引值相同,即为不重复,返回该值于新数组中
                return arr.indexOf(item, 0) === index
            })
        }
        console.log('filter+indexOf去重', unique6(arr));
posted @ 2022-10-29 18:18  新时代的搬砖人  阅读(102)  评论(0)    收藏  举报