手写功能函数: 对比两条数据是否完全相等

函数设计

功能

对比两条数据是否完全相等

参数

参数1:数据1  参数2:数据2

返回值

boolean类型

思路

1.对于非对象和函数的数据类型,使用字符串化的形式进行对比

2.对于对象类型,需要将对象的键组成一个数组进行长度对比,长度相同后对每一个键和值进行对比,如果值为数组或者对象类型,进行递归调用函数

3.对于数组类型,对于数组长度进行对比,长度相同的情况下使用递归对每一个子元素进行对比

4.核心使用every函数,只要返回false,就代表不通过

实现

 let diffData = function (data1, data2) {
            let result = null
            if (toString.call(data1) === toString.call(data2)) {
                switch (toString.call(data1)) {
                    //对象类型
                    case '[object Object]':
                        let keys1 = Object.keys(data1)
                        let keys2 = Object.keys(data2)
                        //属性键值数量相同
                        if (keys1.length === keys2.length) {
                            //属性键相同
                            if (keys1.every((item1, index1) => {
                                return keys1[index1] === keys2[index1]
                            })) {
                                //键值数量相同并且键的值也相同,递归判断每一项是否都相同
                                result = keys1.every((item2, index2) => {
                                    return diffData(data1[item2], data2[item2])
                                })
                                return result
                            }
                            //属性键值不同
                            else {
                                result = false
                                return result
                            }
                        }
                        //属性键值数量不同
                        else {
                            result = false
                            return result
                        }
                        break
                    //数组类型
                    case '[object Array]':
                        //数组长度相同
                        if (data1.length === data2.length) {

                            //递归对比数组内的每一项
                            result = data1.every((item1, index1) => {
                                return diffData(data1[index1], data2[index1])
                            })
                            return result
                        }
                        //数组长度不同
                        else {
                            result = false
                            return result
                        }

                        break
                    default:
                        //非对象和数组的其他类型,需要先全部转换为字符串形式,再进行对比
                        if (`${data1}` === `${data2}`) {
                            result = true
                            return result
                        } else {
                            result = false
                            return result
                        }
                }
            } else {
                result = false
            }
        }

测试

       let obj1 = {
            name: '王惊涛',
            age: 27,
            obj: {
                name: '小王王1',
                d:null
            },
            arr: [1,2,3,{aa:1},undefined]
        }
        let obj2 = {
            name: '王惊涛',
            age: 27,
            obj: {
                name: '小王王1',
                d:null
            },
            arr: [1,2,3,{aa:1},undefined]
        }
        let obj3 = {
            name: '王惊涛',
            age: 27,
            obj: {
                name: '小王王1',
                d:null
            },
            arr: [1,2,3,{aa:1},'undefined']
        }
        console.log(diffData(obj1, obj2))
        console.log(diffData(obj1, obj3))

猜你喜欢

转载自blog.csdn.net/m0_54741495/article/details/132473638