前言

数组去重是很常见的,这里总结一下,本人学过的数组去重的办法

1、数组遍历联合indexOf

indexOf 办法可返回指定元素在数组中首次呈现的地位,如果没有,就返回-1

<script>    var obj1 = {        name: 'tom',        age: 18    };    var obj2 = {        name: 'tom',        age: 18    };    console.log(obj1 == obj2);// false    //这里对象的比拟是比拟对象的援用地址是否雷同    var array = [1, 2, 3, null, 'aa', 'bb', 'aa', 2, 3, {        name: 'tom',        age: 18    }, {        name: 'cat',        age: 19    }, {        name: 'tom',        age: 18    }, undefined, undefined, null]            function unique1(arr) {        console.time("unique1");// 开始计时,测试程序运行工夫        let list = []        for (var i = 0; i < arr.length; i++) {            if (list.indexOf(arr[i]) === -1) {                list.push(arr[i])            }        }        console.timeEnd("unique1");// 完结计时,输入工夫        return list;    }    console.log(unique1(array));</script>

2、Set

Set 属于ES6提供的新的数据结构

<script>    //1、Set    function unique2(arr) {        console.time("unique2");        let list = Array.from(new Set(arr));        console.timeEnd("unique2");        return list;    }    console.log(unique2(array));</script>

3、includes

includes 能够用来判断数组中是否蕴含某个元素

<script>   function unique3(arr) {        console.time("unique3");        let list = []        for (let i = 0; i < arr.length; i++) {            if (!list.includes(arr[i])) {                list.push(arr[i])            }        }        console.timeEnd("unique3");        return list    }    console.log(unique3(array));     </script>

4、reduce联合indexOf

reduce 作为数组办法,能够用来数组遍历

<script>     function unique5(arr) {        console.time("unique5");        let newArr = Array.from(arr).reduce((pre, now) =>            pre.includes(now) ? pre : [...pre, now], [])        console.timeEnd("unique5");        return newArr    }    console.log(unique5(map1));</script>

5、hasOwnProperty

hasOwnProperty 能够判断是否存在对象属性

<script>    function unique5(arr) {        console.time("unique5");        var obj = {};        var newArr = arr.filter(function (item, index, arr) {            return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)        })        console.timeEnd("unique5");        return newArr    }    //后果中,雷同属性值的对象被去重了,阐明hasOwnProperty 在比拟时,是判断每个元素的值是否雷同    console.log(unique5(map));</script>

6、总结

残缺代码

<script>    var obj1 = {        name: 'tom',        age: 18    };    var obj2 = {        name: 'tom',        age: 18    };    console.log(obj1 == obj2); // false    //这里对象的比拟是比拟对象的援用地址是否雷同    var array = [1, 2, 3, null, 'aa', 'bb', 'aa', 2, 3, {        name: 'tom',        age: 18    }, {        name: 'cat',        age: 19    }, {        name: 'tom',        age: 18    }, undefined, undefined, null]    //1、indexOf    function unique1(arr) {        console.time("unique1"); // 开始计时,测试程序运行工夫        let list = []        for (var i = 0; i < arr.length; i++) {            if (list.indexOf(arr[i]) === -1) {                list.push(arr[i])            }        }        console.timeEnd("unique1"); // 完结计时,输入工夫        return list;    }    var map1 = [1, 2, 3, 4, 4, 'dog', 'cat', 'dog', undefined, null, undefined, null]    console.log(unique1(array));    //2、Set    function unique2(arr) {        console.time("unique2");        let list = Array.from(new Set(arr));        console.timeEnd("unique2");        return list;    }    console.log(unique2(array));    //3、includes    function unique3(arr) {        console.time("unique3");        let list = []        for (let i = 0; i < arr.length; i++) {            if (!list.includes(arr[i])) {                list.push(arr[i])            }        }        console.timeEnd("unique3");        return list    }    console.log(unique3(array));    //4、reduce+indexOf    function unique4(arr) {        console.time("unique4");        let newArr = Array.from(arr).reduce((pre, now) =>            pre.includes(now) ? pre : [...pre, now], [])        console.timeEnd("unique4");        return newArr    }    console.log(unique4(array));    //5、hasOwnProperty    function unique5(arr) {        console.time("unique5");        var obj = {};        var newArr = arr.filter(function (item, index, arr) {            return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)        })        console.timeEnd("unique5");        return newArr    }    console.log(unique5(array));</script>

从下面几个办法的测试能够看出程序运行工夫大小排序(因为数据太小,运行工夫也小):

hasOwnProperty > reduce + indexOf > includes > indexOf > Set