一:数组去重
暂时记录了三种…
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
}