数组去重 * 3 & 深度比较isEqual

这篇博客介绍了三种JavaScript数组去重的方法,包括使用forEach、Set和双重循环实现。此外,还详细讲解了一个深度比较函数isEqual,用于判断两个对象或数组是否完全相等,适合于深度比较复杂的对象结构。
摘要由CSDN通过智能技术生成

一:数组去重

暂时记录了三种…

1:最为经典及简洁

function unique2(arr){
  const result = []
  arr.forEach(e => {
  // 没有的话直接往里面加
	  if(result.indexof(e) < 0) {
	      result.push(e)
	  }
  })
}
   该方法的思路同样可以应用于交换数组中指定下标的元素
arrExchange(arr, index1, index2) {
	var resultArr = []
	arr.forEach((item,index) => {
	   if(index === index1){
	      resultArr.push(arr[index2])
	   }else if(index === index2) {
	      resultArr.push(arr[index1])
	   }else {
	      resultArr.push(item)
	   }
	})
	return resultArr
}

2:set的使用(ES6 中最常用)

function unique3(arr) {
  const result = new Set(arr)
  // Array.from可将将Set结构的数据转换为真正的数组
  return Array.from(result)
  // return [...result]
}

3: 自己的第一反应

function unique1(arr) {
   for(var i=0;i<arr.length;i++){
      const flag = arr[i]
      // 从后面的未去重的数组中找到相同的就剔除
      for(var j=i+1;j<arr.length;j++) {
         if(arr[j] === flag){
            arr.splice(j,1)
            j--
         }
      }
   }
  }

关于Array.from的详细使用,可参考ES6之Array.from()方法

二:深度比较isEqual()

用法:
const obj1 = {a:100,b:{x:10,y:20}}
const obj2 = {a:100,b:{x:10,y:20}}
isEqual(obj1,obj2) === true

// 判断是否是对象或者数组
function isObject(value){
   return typeof value === 'object' && value !== null
}
// 深度比较
function isEqual(obj1,obj2) {
  // 两个数据有任何一个不是对象或者或数组,都不需要深度比较,直接全等比较即可
  // 此时该判断为true 的条件一般就是 值类型了,函数一般不会参与equal判断
  if(!isObject(obj1) || !isObject(obj2)) return obj1 === obj2
  // 传入的参数都是同一个对象或者数组
  if(obj1 === obj2) return true
  
  const keyArr1 = Object.keys(obj1)
  const keyArr2 = Object.keys(obj2)
  // key 的长度都不一致,直接false
  if(keyArr1.length !== keyArr2.length ) return false
  // 选一个作为基准,依次取出对应key,one by one 递归比较
  // 什么时候递归要注意,当你进入的判断和你之前写的逻辑一致时,参考深拷贝
  keyArr1.forEach(e => {
    // 每一对的属性值判断要接住
    // 否则直接 return 的话会出现一个属性值对比结果为true的话,整个函数返回就是true
    const partRes = isEqual(obj1[e],obj2[e] )
    // 有false 的倒是可以一遇到就返回
    if(!partRes) return false
  })
  // 前面判断都走完的话,到了这一步,传入的俩参数也就全相等了
  return true
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值