数组去重的方法

168 阅读2分钟

目前学习了基础的javascript,对数组去重进行了一部分总结,以下是总结的三个方法

方法一 利用双重for循环

let arr1 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
        for (let i = 0; i < arr1.length; i++) {
            let element1 = arr1[i]; //得到数组的第i个元素
            //用i+1及之后的每一个元素与第i个元素进行比较,相同删除第i个元素,不同就保留
            for (let j = i + 1; j < arr1.length; j++) {
                let element2 = arr1[j];
                if (element2 === element1) {
                    arr1.splice(j, 1);
                    j--;
                }
            }
        }
        console.log(arr1); //[1, 3, '3', {…}, {…}, NaN, NaN, undefined, null]
        let arr2 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
        for (let i = 0; i < arr2.length; i++) {
            let element1 = arr2[i]; //得到数组的第i个元素
            //用i+1及之后的每一个元素与第i个元素进行比较,相同删除第i个元素,不同就保留
            for (let j = i + 1; j < arr2.length; j++) {
                let element2 = arr2[j];
                if (element2 == element1) {
                    arr2.splice(j, 1);
                    j--;
                }
            }
        }
        console.log(arr2); //[1, 3, {…}, {…}, NaN, NaN, undefined]

方法二 利用对象属性名的唯一性

let arr1 = [1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null];
        let obj = {};
        let newArr = [];
        for (let i = 0; i < arr1.length; i++) {
            if (obj[arr1[i] + '']) {
                obj[arr1[i] + '']++;
            } else {
                obj[arr1[i] + ''] = 1;
            }
        }
        for (k in obj) {
            newArr.push(k);
        }
        console.log(newArr); //['1', '3', '[object Object]', 'NaN', 'undefined', 'null']
        //注,这种方法里原数组的元素会全部转化为字符串,且原数组中不能有{};

这种思想,我还用在了检查数组中出现元素的次数(对得到的对象进行for in 循环便可以得到出现次数最多或最少的数组元素),麻烦的是它最终得到的新数组完全由字符串组成

方法三 利用indexOf方法

function unique(arr) {
            var newArr = [];
            for (i = 0; i < arr.length; i++) {
                if (newArr.indexOf(arr[i]) === -1) {
                    newArr.push(arr[i]);
                }
            }
            return newArr;
        }
        console.log(unique([1, 1, 1, 3, '3', 3, {}, {}, NaN, NaN, undefined, undefined, null, null]));
        //[1, 3, '3', {…}, {…}, NaN, NaN, null, undefined]
        //不能对重复的{},NaN去重

这种方法的代码量较少,但不能对重复的{},NaN去重

总结:使用这三种方法时,对于NaN不能去重,进行代码验证后,我得出了下列结果,任何一个NaN与另一个NaN都是不等的。NaN==NaN的结果永远是flase。