手写:对象数组去重,对象属性只会是基本数据类型 去重前: [{a:1,b:2},{b:2,a:1},{c:1},{a:‘1‘,b:2}] 去重后: [{a:1,b:2},{c:1},{a:‘1‘,b:

该文章展示了一个JavaScript函数,用于判断两个元素是否相等,包括对基本类型和复杂类型(如对象、数组)的深度比较。此外,还提供了一个数组去重的函数,利用对象比较来确保数组中的对象是唯一的,即使它们的顺序不同或属性顺序不同。
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 获取类型
        const getType = (function () {
            const class2type = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regexp', '[object Object]': 'object', '[object Error]': 'error', '[object Symbol]': 'symbol' }

            return function getType(obj) {
                if (obj == null) {
                    return obj + ''
                }
                // javascript高级程序设计中提供了一种方法,可以通用的来判断原始数据类型和引用数据类型
                const str = Object.prototype.toString.call(obj)
                return typeof obj === 'object' || typeof obj === 'function' ? class2type[str] || 'object' : typeof obj
            };
        })();

        /**
         * 判断两个元素是否相等
         * @param {any} o1 比较元素
         * @param {any} o2 其他元素
         * @returns {Boolean} 是否相等
         */
        const isEqual = (o1, o2) => {
            const t1 = getType(o1)
            const t2 = getType(o2)

            // 比较类型是否一致
            if (t1 !== t2) return false

            // 类型一致
            if (t1 === 'array') {
                // 首先判断数组包含元素个数是否相等
                if (o1.length !== o2.length) return false
                // 比较两个数组中的每个元素
                return o1.every((item, i) => {
                    // return item === target
                    return isEqual(item, o2[i])
                })
            }

            if (t2 === 'object') {
                // object类型比较类似数组
                const keysArr = Object.keys(o1)
                if (keysArr.length !== Object.keys(o2).length) return false
                // 比较每一个元素
                return keysArr.every(k => {
                    return isEqual(o1[k], o2[k])
                })
            }

            return o1 === o2
        }

        // 数组去重
        const removeDuplicates = (arr) => {
            return arr.reduce((accumulator, current) => {
                const hasIndex = accumulator.findIndex(item => isEqual(current, item))
                if (hasIndex === -1) {
                    accumulator.push(current)
                }
                return accumulator
            }, [])
        }

        // 测试
        const arr = [{ a: 1, b: 2 }, { b: 2, a: 1 }, { c: 1 }, { a: '1', b: 2 }];
        console.log(removeDuplicates(arr));

    </script>
</body>

</html>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值