JS代码题10

数组去重

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;i1) {
                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以后的元素都不能被比较。
有可能是我想得太复杂了,写得真的很多。。。

你可能感兴趣的:(JS代码题10)