【Javascript】常见算法

131 阅读1分钟

这是我参与更文挑战的第7天,活动详情查看: 更文挑战

1. 如何获取浏览器URL中查询字符串中的参数?

function getParamsWithUrl(url) {    
   var args = url.split('?');   
   if (args[0] === url) {        
       return "";
    }    
    var arr = args[1].split('&');    
    var obj = {};    
    for ( var i = 0;
     i < arr.length; i++) 
     {        
       var arg = arr[i].split('=');
        obj[arg[0]] = arg[1];
    }    
    return obj;
}
 
var href = getParamsWithUrl
('http://baidu.com?name=美图');
console.log(href['name']); // 美图

2. 写一个深度克隆方法(es5)?

/**
 *  深拷贝
 * @param {object}fromObj 拷贝的对象
 * @param {object}toObj  目标对象
 */
function deepCopyObj2NewObj(fromObj, toObj) {   
   for(var key in fromObj){       
     // 1. 取出键值对
     var fromValue = fromObj[key];       
     // 2. 检查当前的属性值是什么类型
     // 如果是值类型,那么就直接拷贝赋值
     if(!isObj(fromValue)){
       toObj[key] = fromValue;
     }else {           
        // 如果是引用类型,
        // 那么就再调用一次这个方法,
        // 去内部拷贝这个对象的所有属性
        var tempObj = 
        new fromValue.constructor;
        console.log(fromValue.constructor);
        deepCopyObj2NewObj(fromValue, tempObj);
        toObj[key] = tempObj;
     }
   }
}

/**
 * 辅助函数, 判断是否是对象
 * @param {object}obj
 * @returns {boolean}
 */
function isObj(obj) {  
    return obj instanceof Object;
}

3. 对数组[1,2,3,8,2,8]进行去重,es5或者es6方法?

es5四种方式:
方式一:
Array.prototype.unique1 = function() {    
    // 1. 定义数组
    var temp = [];    
    // 2. 遍历当前数组
    for(var i = 0; 
       i < this.length; i++) {        
        // 3.如果当前数组的第i
        // 已经保存进了临时数组,
        // 那么跳过,否则把当前项
        // push到临时数组里面
        if (-1 === temp.indexOf(this[i])) 
        {
           temp.push(this[i]);
        }
    }    
    return temp;
};

方式二:
Array.prototype.unique2 = function() {    
    //1. hash为hash表,r为临时数组
    var hash = {}, temp=[];    
    // 2.遍历当前数组
    for(var i = 0; i < this.length; i++)
    {        
        // 3. 如果hash表中没有当前项
        if (!hash[this[i]])
        {            
            // 4.存入hash表
            hash[this[i]] = true;            
            // 5.把当前数组的当前项
            // push到临时数组里面
            temp.push(this[i]);
        }
    }    
    return temp;
};

方式三:
Array.prototype.unique3 = function() {    
    var n = [this[0]];    
    for(var i = 1; 
        i < this.length; i++){        
       if (this.indexOf(this[i]) === i) {
            n.push(this[i]);
        }
    }    
    return n;
};

方式四:
Array.prototype.unique4 = function() {    
    this.sort();    
    var re=[this[0]];    
    for(var i = 1; 
        i < this.length; i++) {        
     if( this[i] !== re[re.length-1]){
        re.push(this[i]);
     }
    }    
    return re;
};

es6实现方式:
Array.prototype.unique =
Array.prototype.unique || 
() =>{    
    return [...new Set(this)];
};

4. 如何判断一个对象是否为数组?

function isArray(arg) {    
   if (typeof arg === 'object') {        
       return 
       Object.prototype.toString.call(arg)
       === '[object Array]';
    }   
    return false;
}

5. 冒泡排序?

思路:
每次比较相邻的两个数,
如果后一个比前一个小,换位置;

var arr = [2, 0, 1, 9, 8, 7, 3];
function bubbleSort(arr) {   
   for (var i = 0;
        i < arr.length - 1; i++) {
      for(var j = 0; 
          j < arr.l    i - 1; j++) {
         if(arr[j + 1] < arr[j]) {
            var temp;
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
         }
       }
   }
  return arr;
}
console.log(bubbleSort(arr));

6. 快速排序?

思路: 采用二分法,取出中间数,
数组每次和中间数比较,
小的放到左边,大的放到右边;

var arr = [2, 0, 1, 9, 8, 7, 3];
function quickSort(arr) {
    if(arr.length == 0) {
       // 返回空数组
       return [];    
    }
    var cIndex = Math.floor(arr.length / 2);    
    var c = arr.splice(cIndex, 1);    
    var l = [];    
    var r = [];
    for (var i = 0; 
         i < arr.length; 
         i++) {  
      if(arr[i] < c) {
         l.push(arr[i]);
      } else {
         r.push(arr[i]);
      }
    }    
    return quickSort(l).concat(c, quickSort(r));
}
console.log(quickSort(arr));

7. 正则表达式验证邮箱格式?

var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w{2,3}){1,3})$/;
var email = "yjh@itlike.com";
console.log(reg.test(email));  // true  
8. 正则表达式清除字符串前后的空格?
function trim(str) {
    if (str && typeof str === "string") 
    {        
        // 去除前后空白符
        return 
        str.replace(/(^\s*)|(\s*)$/g,""); 
    }
}