判断两个数组、对象内元素是否相同(不考虑元素顺序)

1,045 阅读1分钟
我深深认识到重要的是逻辑思维。

此处相同仅指两个数组(或对象)内包含元素是否相同。元素仅包含简单类型即数组内元素不含对象,对象内元素不再嵌套内层或使用对象数组类key、value
本质上一个数组、一个对象永不可能直接等于另一个。二者皆为引用数据类型,定义一个数组,即获得一个地址,地址内指针指向值存储位置。
好吧,接下来展示一下我的简单思维。

一、判断两个数组是否相同

思路:判断一个两个数组是否相同需要考虑长度&&值均等(不考虑元素顺序),相同返回true,反之false
逻辑:

  1. 数组长度是否相等——>不等返回false
  2. 数组内各项元素是否相等
const arr1 = ['a', 1, 'b', 2]
const arr2 = [1, 2, 'a', 'b']
const arr3 = [1, 2]

function arraysIsEqual(arr1, arr2) {
    if (arr1.length !== arr2.length) return false
        for(let i = 0;i< arr1.length;i++){
            if (arr2.indexOf(arr1[i]) === -1){
                return false
            }     
        }
     return true
}

arraysIsEqual(arr1,arr2); // true
arraysIsEqual(arr1,arr3); // false

二、判断两个对象是否相等

思路:长度&&key&&value均等
逻辑:

  1. 长度是否相等——>不等返回false
  2. key是否相等
  3. 相同key下的value是否相等
function objIsEqual(obj1,obj2){
    const keys1 = Object.keys(obj1)
    const keys2 = Object.keys(obj2)
    if(keys1.length!==keys2.length) return false

        // key是否相等
        if(arraysIsEqual(keys1,keys2)){
            // 同一key下value是否相等
            for (let i = 0; i < keys1.length; i++) {
                if (obj2[i] !== obj1[i]) {
                    return false
                }
            }
            return true
        }else{
            return false
        } 
}

上面是我开始想到的,其中判断key是不是相同用到了【一】中的方法。同事看我写的之后,顺着我的想法提醒我可以通过但实际可以不用。

function objIsEqual2(obj1, obj2) {
        const keys1 = Object.keys(obj1)
        const keys2 = Object.keys(obj2)
        if (keys1.length !== keys2.length) return false

        for(let key of keys1){
            // key不同或者同key不同值
            if (!keys2.includes(key) || obj1[key] !== obj2[key]){
                return false
            }
            // key同
            // if(keys2.includes(key)){
            //     // 同key下value相同
            //     if(obj1[key] !== obj2[key]){
            //         return false
            //     }
            // }else return false
        }
        return true

    }