• javascript面试常见算法整理


    - 高效率冒泡排序

    /** 
     * 外层for循环控制循环次数
     * 内层for循环负责相邻两数交换位置,找到最大数,排到最后
     * 设置done标志位,减少不必要循环
    */
    var arr = [1, 3, 4, 90, 8, 49, 0];
    var max = arr.length - 1;
    for (var j = 0; j < max; j++) {
        var done = true;
        // 这里可以根据外层的j 逐渐减少内层遍历        
        // 因为每次遍历置于最后的元素  
        // 不需要在参加遍历 [1, 3, 4, 0, 8, 49, 90]
        for (var i = 0; i < max - j; i++) {
            if (arr[i] > arr[i + 1]) {
                var temp = arr[i];
                arr[i] = arr[i + 1];
                arr[i + 1] = temp;
                done = false;
            }
        }
        if (done) {
            break;
        }
    }
    

    - 快速排序

    function quickSort(arr){
      if(arr.length<1){
        return arr;
      }
      var pivotIndex=Math.floor(arr.length/2);//找到那个基准数
      var pivot=arr.splice(pivotIndex,1)[0]; //取出基准数,并去除,splice返回值为数组。
      var left=[]; 
      var right=[];
      for(var i=0;i<arr.length;i++){
        if(arr[i]<pivot){
          left.push(arr[i]);
        }else{
          right.push(arr[i]);
        }
      }
      return quickSort(left).concat([pivot],quickSort(right)); //加入基准数
    }
    arr=[2,1,5,8,3,7,4,6,9];
    console.log(quickSort(arr)); //[1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    - 数组去重的三种解决方法

    function unique(arr) {
       var res = []; //声明目标数组
       for(var i=0;i<arr.length;i++) {
         for(var j=0;j<res.length;j++) {
           // 如果在目标数组中找到该重复元素则跳出循环
           if(arr[i].id===res[j].id) {
             break;
           }
         }
         if(j===res.length) {
           res.push(arr[i]);
         }
       }
      return res;
    }
    var result = unique(arr2);
    //indexOf去重
    function unique(origin){
        var result = [];
        for(var i = 0; i< origin.length; i++) {
            var item = origin[i];
            if(result.indexOf(item) === -1) {
                result.push(item);
            }
        }
        return result;
    }
    //利用Object的key value属性
    function unique(origin) {
        var result = [];
        var hashTable = {};
        for(var i = 0; i< origin.length; i++) {
            // 如果键对应的值,为真,意味着对象的键中已经有重复的键了。
            if(!hashTable[origin[i].id]) {
                // 将元素作为对象的键,默认键对应的值为 true, 
                hashTable[origin[i].id] = true;
                // 如果对象中没有这个键,则将这个元素放入结果数组中去。
                result.push(origin[i]);
            }
        }
        return result;
    }
    // 使用ES6方法
    function unique(origin) {
        return Array.from(new Set(origin));
    }
    

    - javasript实现深度复制的几种方法

    // 定义一个深拷贝函数  接收目标target参数
    function deepClone(target) {
        // 定义一个变量
        let result;
        // 如果当前需要深拷贝的是一个对象的话
        if (typeof target === 'object') {
        // 如果是一个数组的话
            if (Array.isArray(target)) {
                result = []; // 将result赋值为一个数组,并且执行遍历
                for (let i in target) {
                    // 递归克隆数组中的每一项
                    result.push(deepClone(target[i]))
                }
             // 判断如果当前的值是null的话;直接赋值为null
            } else if(target===null) {
                result = null;
             // 判断如果当前的值是一个RegExp对象的话,直接赋值    
            } else if(target.constructor===RegExp){
                result = target;
            }else {
             // 否则是普通对象,直接for in循环,递归赋值对象的所有值
                result = {};
                for (let i in target) {
                    result[i] = deepClone(target[i]);
                }
            }
         // 如果不是对象的话,就是基本数据类型,那么直接赋值
        } else {
            result = target;
        }
         // 返回最终结果
        return result;
    }
    //终极方案
     function copyObject(orig) {
        var copy = Object.create(Object.getPrototypeOf(orig));
        copyOwnPropertiesFrom(copy, orig);
        return copy;
      }
    
    
      function copyOwnPropertiesFrom(target, source) {
        Object
        .getOwnPropertyNames(source)
        .forEach(function (propKey) {
          var desc = Object.getOwnPropertyDescriptor(source, propKey);
          Object.defineProperty(target, propKey, desc);
        });
        return target;
      }
    
  • 相关阅读:
    对成本的理解
    Oracle ERP中帐户类型和会计科目分类的关系---待完善
    固定资产调整对资产折旧的影响
    20201111 eset internet security keys | NOD 32 keys | ESET MOBILE LICENSE KEYS
    一些常用到的windows ISO download 文件下载资源
    读《改变心理学的40项研究》有感,之一
    有归从,可与有。2019.07.09.
    灼钓鱼炭 2019.07.08.
    人居一世间, 忽若风吹尘 2019.07.07.
    exported wechat's voice! 成功导出微信语音! 2019.07.06.
  • 原文地址:https://www.cnblogs.com/Lewiskycc/p/12205017.html
Copyright © 2020-2023  润新知