美文网首页
字节跳动一面

字节跳动一面

作者: 可爱多小姐 | 来源:发表于2020-08-10 00:01 被阅读0次

    1、对象数组去重
    https://blog.csdn.net/sunnyboysix/article/details/102815792

            function uniqueByKeys(obj, keys) {
                var uniques = [];
                var stringify = {};
                for (var i = 0; i < obj.length; i++) {
                    var str = " ";    //没有考虑边界问题,这里存在问题【数字1 == 字符串“1” 】
                    for (var j = 0; j < keys.length; j++) {
                        str += JSON.stringify(keys[j]);
                        str += JSON.stringify(obj[i][keys[j]])  //此处还可以优化,这里相当于循环嵌套
                    }
                    if (!stringify.hasOwnProperty(str)) {
                        uniques.push(obj[i]);
                        stringify[str] = true
                    }
                }
                return uniques;
            }
    

    数组去重三种方法
    下面的三个方法:distinct1和distinct2保留元数据,获取去重后的新数组,distinct3是直接对元数据进行修改的。

    // 方法一
    function distinct1(arr,key){
        var newobj = {},newArr = [];
        for(var i=0;i<arr.length;i++){
            var item = arr[i];
            if(!newobj[item[key]]){
                newobj[item[key]] = newArr.push(item);
            }
        }
        return newArr;
    }
    // 方法二
    function distinct2(arr,key){
        var newArr = [];
        for(var i=0;i<arr.length;i++){
          var flag = true;
          for(var j=0;j<newArr.length;j++){
            if(arr[i].id == newArr[j].id){
              flag = false;
                   break
            };
          }; 
          if(flag){
            newArr.push(arr[i]);
          };
        };
        return newArr;
    }
     
    // 方法三, 方法三会更改数组的原始数据
    function distinct3(arr, key){
        for(let i = 0; i < arr.length; i++) {
            for(let j = i+1; j < arr.length; j++) {
                if(arr[i][key] === arr[j][key]){
                    arr.splice(j, 1);
                    j = j-1;
                }
            }
        }
        return arr;
    }
    
    

    2、手写深拷贝

    function deepClone (obj) {
        let newObj;
        if (Array.isArray(obj)) { // 判断复制的目标是不是数组
            newObj = [];
        } else if (typeof obj === 'object') {
            newObj = {};
        } else {
            newObj = obj;
        };
        if (typeof obj === 'object') {
            for (item in obj) {  //面试官说如果这里使用for...in就不需要再做上面判断类型了,因为for...in循环的是key,for...of循环的才是value。
                if(obj.hasOwnProperty(item)) {
                    if(obj[item] && typeof obj[item] === 'object') {
                        newObj[item] = deepClone(obj[item])
                    } else {
                        newObj[item] = obj[item]
                    }
                }
            }
        }
        return newObj;
    }
    let obj = {name:'小明',age:20}
    newObj = deepClone(obj)
    

    相关文章

      网友评论

          本文标题:字节跳动一面

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