美文网首页
JS代码题10

JS代码题10

作者: twentyshaw | 来源:发表于2019-12-01 10:41 被阅读0次

    数组去重

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

    相关文章

      网友评论

          本文标题:JS代码题10

          本文链接:https://www.haomeiwen.com/subject/kwmvwctx.html