文章类型:个人学习笔记

1.双循环遍历

1
2
3
4
5
6
7
8
9
        let arr = [1,5,6,1,9,9,2,1];
        arr.map((item,index) => {
            arr.map((i,index1) => {
                if(index !== index1 && item === i){
                    arr.splice(index1,1);
                }
            })
        })
        console.log(arr);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
        function unique(array){
            for (let i = 0; i < array.length; i++) {
                for(let j = i+1; j < array.length; j++){
                    if(array[i] === array[j]){
                        arr.splice(j,1);
                    }
                }
            }
            return arr;
        }
        console.log(unique(arr)); // [1, 5, 6, 9, 2]

下面一种方式更优,遍历的次数更少

2. ES6的Set

1
2
3
4
5
        let arr = [1,5,6,1,9,9,2,1];
        function unique(arr) {
            return Array.from(new Set(arr))
        }
        console.log(unique(arr)); // [1, 5, 6, 9, 2]
1
2
3
4
5
        let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
        function unique(arr) {
            return [...new Set(arr)]
        }
        console.log(unique(arr)); // [1, 5, 6, 9, 2]

3.利用indexOf()

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
        let arr = [1,5,6,1,9,9,2,1];
        function unique(arr){
            if(!Array.isArray(arr)){
                console.log('type error');
                return;
            }
            let array = [];
            arr.map(item => {
                if(array.indexOf(item) === -1){
                    array.push(item)
                }
            })
            return array;
        }
        console.log(unique(arr)); // [1, 5, 6, 9, 2]

4.利用sort(),然后比较相邻元素是否相等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
        let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
        function unique(arr) {
            if (!Array.isArray(arr)) {
                console.log('type error!')
                return;
            }
            arr = arr.sort()
            let arrry = [arr[0]];
            arr.map((item, index) => {
                if (index > 0 && item !== arr[index - 1]) {
                    arrry.push(item)
                }
            });
            return arrry;
        }
        console.log(unique(arr)); // [1, 2, 5, 6, 9]

5.利用filter(),当找到的下标不等于当前下标时就证明这个元素在前面出现过,排除掉

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
        function unique(arr) {
            if (!Array.isArray(arr)) {
                console.log('type error!')
                return;
            }
            return arr.filter((item, index) => {
                return arr.indexOf(item) === index;
            })
        }

        console.log(unique(arr)); // [1, 5, 6, 9, 2]

秒啊!

6.利用reduce()方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
        let arr = [1, 5, 6, 1, 9, 9, 9, 9, 9, 2, 1];
        function unique(arr) {
            if (!Array.isArray(arr)) {
                console.log('type error!')
                return;
            }
            return arr.reduce((prev, cur, index) => prev.includes(cur) ? prev : [...prev, cur], []);
        }

        console.log(unique(arr)); // [1, 5, 6, 9, 2]

秀啊!

总结:ES6下,以上几种方法首选第二种 new Set(),其次选择filter()和reduce()