数组去重
1. 简易版
不考虑引用类型
function uniq(arr) {
var myarr = []
var flag = true
for (var i = 0; i < arr.length; i++) {
if (myarr.indexOf(arr[i]) === -1) {
if (arr[i] !== arr[i]) { //判断该元素是否为NaN,因为indexOf(NaN)会返回-1
if (flag) {
myarr.push(arr[i])
flag = false
}
}else{
myarr.push(arr[i])
}
}
}
return myarr
}
2. 复杂版
当数组元素为引用类型的时候,不能用indexOf()来判断。因为他总是会返回-1
function uniq(arr) {
var flag = true
var myArr = []
var myObj = []
for(let i=0;i<arr.length; i++){
if (arr[i] !== arr[i]) {
if (!flag) {
arr.splice(i,1)
i--
}else{
flag = false
}
}else if(Array.isArray(arr[i])){
myArr.push(arr[i])
if (myArr.length>1) {
for (let j = 0; j < myArr.length; j++) {
for (let m = myArr.length-1; m > j ; m--) {
var arrResult = eqArr(myArr[j],myArr[m])
if (arrResult) {
myArr.splice(m,1) // 这里删除元素后,m不用减1,是因为本身m就是最末尾的元素,删除它不会影响序号
}
}
}
}
arr.splice(i,1)
i--
}else if(arr[i] !== null && typeof arr[i] === "object"){
myObj.push(arr[i])
if (myObj.length>1) {
for (let k = 0; k < myObj.length; k++) {
for (let n = myObj.length-1; n > k; n--) {
var objResult = eqObj(myObj[k],myObj[n])
if (objResult) {
myObj.splice(n,1)
}
}
}
}
arr.splice(i,1)
i--
}else{
if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
arr.splice(i,1)
i--
}
}
}
var result1 = arr.concat(myArr)
var result = result1.concat(myObj)
return result
}
function eqObj(a,b){
if (Object.keys(a).length !== Object.keys(b).length) { //属性不一样多 直接可以判断为二者不相等
return false
}else{
for(var i in a){
if (b.hasOwnProperty(i)) {
if (a[i] !== b[i]) {
if (typeof a[i] === "object" && typeof b[i] === "object") {
if (Array.isArray(a[i]) && Array.isArray(b[i])) {
if(!(eqArr(a[i],b[i]))) return false
}else{
if(!(eqObj(a[i],b[i]))) return false
}
}else{
return false
}
}
}else{
return false
}
}
return true
}
}
function eqArr(a,b){
if (a.length !== b.length) { //两数组长度不一样,直接判断为而这不相等
return false
}else{
for (var i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
if (typeof a[i] === "object" && typeof b[i] === "object") {
if (Array.isArray(a[i]) && Array.isArray(b[i])) {
if(!(eqArr(a[i],b[i]))) return false
}else{
if(!(eqObj(a[i],b[i]))) return false
}
}else{
return false
}
}
}
return true
}
}
上面的方法运用了递归。
注意在eqArr()
函数(或eqObj()
)的循环中不能有 return true
的语句。因为这样会终止循环,导致index = i
以后的元素都不能被比较。
有可能是我想得太复杂了,写得真的很多。。。
网友评论