我深深认识到重要的是逻辑思维。
此处相同仅指两个数组(或对象)内包含元素是否相同。元素仅包含简单类型即数组内元素不含对象,对象内元素不再嵌套内层或使用对象数组类key、value
本质上一个数组、一个对象永不可能直接等于另一个。二者皆为引用数据类型,定义一个数组,即获得一个地址,地址内指针指向值存储位置。
好吧,接下来展示一下我的简单思维。
一、判断两个数组是否相同
思路:判断一个两个数组是否相同需要考虑长度&&值均等(不考虑元素顺序),相同返回true,反之false
逻辑:
- 数组长度是否相等——>不等返回false
- 数组内各项元素是否相等
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均等
逻辑:
- 长度是否相等——>不等返回false
- key是否相等
- 相同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
}