首页 > 试题广场 >

编写一个Javascript函数,传入一个数组,对数组中的元

[问答题]
编写一个Javascript函数,传入一个数组,对数组中的元素进行去重并返回一个无重复元素的数组,数组的元素可以是数字、字符串、数组和对象。举例说明:
    1. 如传入的数组元素为[123, "meili", "123", "mogu", 123],则输出:[123, "meili", "123", "mogu"]
    2. 如传入的数组元素为[123, [1, 2, 3], [1, "2", 3], [1, 2, 3], "meili"],则输出:[123, [1, 2, 3], [1, "2", 3], "meili"]
    3. 如传入的数组元素为[123, {a: 1}, {a: {b: 1}}, {a: "1"}, {a: {b: 1}}, "meili"],则输出:[123, {a: 1}, {a: {b: 1}}, {a: "1"}, "meili"]
这道题如果想兼容多种情况,要使用深度克隆的过程来进行判断,否则题目如果有一些改动,那么就可能会出现问题
Array.prototype.uniq = function(){
    let len = this.length;
    let arr = [];
    let temp = {};
    for(let i = 0; i < len; i++){
        if(typeof this[i] !== 'object'){
            let key = null;
            if(typeof this[i] === 'number'){
                key = this[i] + '1';
            }else{
                key = this[i];
            }
            if(!temp[key]){
                temp[key] = 'a';
                arr.push(this[i]);
            }
        }else if(typeof this[i] === 'object'){
            let flag = check(this[i], arr);
            if(flag){
                arr.push(this[i]);
            }
        }
    }
    return arr;
}
//判断是数组还是对象
function check(value, arr){
    let flag = false;
    //判断元素是否是数组
    for(let i = 0; i < arr.length; i++){
        if(Array.isArray(arr[i])){
            if(Array.isArray(value)){
                flag = checkArray(value, arr[i]);
                if(flag == true){
                    return false;
                }
            }
        }else if(arr[i] instanceof Object){
            if(value instanceof Object){
                flag = checkObject(value, arr[i]);
                if(flag == true){
                    return false;
                }
            }
        }else if(i === arr.length - 1){
            return true;
        }
    }
    return true;
}
//判断两个数组是否相同
function checkArray(arr1, arr2){
    //如果数组的长度不同,肯定不一样
    if(arr1.length !== arr2.length){
        return false;
    }
    for(let i = 0; i < arr1.length; i++){
        if(Array.isArray(arr1[i]) && Array.isArray(arr2[i])){
            return checkArray(arr1[i], arr2[i]);
        }
        if(arr1[i] !== arr2[i]){
            return false;
        }
    }
    return true;
}
//判断两个对象是否相同
function checkObject(obj1, obj2){
    let len1 = Object.getOwnPropertyNames(obj1).length;
    let len2 = Object.getOwnPropertyNames(obj2).length
    //如果两个对象的属性名长度不同则肯定不一样
    if(len1 !== len2){
        return false;
    }
    for (const prop in obj1) {
        if(typeof obj1[prop] === 'object' && typeof obj2[prop] === 'object'){
            return checkObject(obj1[prop], obj2[prop]);
        }
        if(obj1[prop] !== obj2[prop]){
            return false;
        }
    }
    return true;
}


发表于 2020-05-03 00:57:51 回复(0)
        function distinct (arr) {
           let hash = {}
           let newArray = []
           for(let i =0; i<arr.length; i++){
               let string = JSON.stringify(arr[i])
               if(!hash[string]){
                   hash[string] = 1
                   newArray.push(JSON.parse(string)) 
               }
           }
           return newArray
        }
发表于 2019-02-26 17:46:47 回复(4)
function unique (arr) {
    let result = [];
    for (let str of arr){
        if(!result.includes(str)){
            result.push(str);
        }
    }
    return result;
}
发表于 2019-09-01 16:02:00 回复(0)
function unique1(arr)
{ var hash=[]; for (var i = 0; i < arr.length; i++) 
    { if(hash.indexOf(arr[i])==-1)
        {
              hash.push(arr[i]);
         }
    } return hash;
}

发表于 2019-03-08 19:22:50 回复(0)
function getNewArr(arr){
                var obj = {};
                var newArr = [];
                for(var i = 0;i<arr.length;i++){
                    var strName = JSON.stringify(arr[i]);
                    if(!obj.strName){
                        obj.strName = 1;
                    }
                    else{
                        newArr.push(JSON.parse(strName));
                    }
                }
                return newArr;
            }
发表于 2018-12-11 14:45:52 回复(2)