分类 JavaScript 下的文章

JavaScript 检测数组是否含有重复的值(支持一位及多维数组)

JavaScript 检测数组是否含有重复的值(支持一位及多维数组)

一位数组、二维数组、三维数组我已经测试通过,其它维度组请自行测试
/**
 * 检测数组(支持一位数组/二维数组 及 多维数组)是否有重复的值
 * @author  NowTime<wenzhouchan@gmail.com>
 * @link    https://nowtime.cc/js/655.html
 * @param   arr          需要判断的数组
 * @returns {boolean}    true:含重复的值 false:不含重复的值
 */
function arr_repeat(arr) {
    let hash = {}, index;

    for(index in arr) {
        if(hash[arr[index]]){
            return true;
        }
        hash[arr[index]] = true;
    }

    return false;
}

运行结果

//一维数组
arr_repeat([1,2,1]);
//运行结果:true

arr_repeat([1,2,3]);
//运行结果:false

--------------------------------------

//二维数组
arr_repeat({ss:"1", sss:"1"});
//运行结果:true

arr_repeat({ss:"1", sss:"2"});
//运行结果:false

--------------------------------------

//三维数组
arr_repeat({ss:[1,2,3], sss:[1,2,3]});
//运行结果:true

arr_repeat({ss:[1,2,3], sss:[1,2,3,4]});
//运行结果:false

JavaScript 遍历数组的多种方式

JS遍历数组的多种方式

1. 普通 for循环

应用最为普遍的循环写法,性能好,可读性好。
for  (let i = 0; i < arr.length; i++){
    //code
}

2. 优化版 for循环

优点:性能比普通for循环好,省去了每次对于数组长度的判断。
缺点:对于长度可能会产生变动的数组,这种方法不适用,可能会导致有的值没被遍历到等错误。
for( let i = arr.length;i > 0; i--){
    //code
}

3. for in循环

优点:提供的三个参数可以很大程度上减少代码长度,可读性好。
缺点:无法遍历对象, 在IE9以上才能使用,而且无法使用 break,continue 跳出循环,使用 return 是跳
过本次循环。
for(let index in arr) {
    //如果arr是数组,index 为索引
    //如果arr是对象,index 为属性
};
for in循环本来是用来遍历对象的属性的,因为数组是特殊的对象,因此也可以用来遍历,需要注意的是,
index在数组和对象中表示的含义是不同的,在对象中,index代表属性,在数组中,index代表索引。

另外在遍历对象时,for in会将原型链上的属性也遍历一遍,如果你不需要原型链上的属性,你可以在循环体执行之前进行一次判断,如下:

if(!arr.hasOwnProperty(index)){ 
    continue; 
} 
arr.forEach(function(value,index,arr){
   value;//当前值
   index;//当前索引
   arr;//原数组
});

5. map 方法

arr.map(function (item,index,arr) {
       return item*10//可以使用return语句来改变相应位置的元素
})

使用方法和 forEach 十分相似,优缺点也是相似的,IE9+才能使用,如果想在低版本IE运行,可以在原型里添加方法,如下:

/**
 1. map遍历数组
 2. @param callback [function] 回调函数;
 3. @param context [object] 上下文;
*/
Array.prototype.myMap = function myMap(callback,context){
    context = context || window;
    if('map' in Array.prototye) {
        return this.map(callback,context);
    }
    //IE6-8下自己编写回调函数执行的逻辑
    var newAry = [];
    for(var i = 0,len = this.length; i < len;i++) {
        if(typeof  callback === 'function') {
            var val = callback.call(context,this[i],i,this);
            newAry[newAry.length] = val;
        }
    }
    return newAry;
}
需要注意的是map方法返回的是一个新的数组,不会改变之前的数组
而且break,continue等语句失效,无法提前跳出循环
而且map方法是可以使用return语句的

6. for of 循环

优点:简洁,可以使用break、continue、return等语句,可以遍历数组、对象、DOM节点数组、Set对象等等
缺点:属于ES6的语法内容,使用时应注意兼容性。
for (var value of arr) {
  //code
}

转载自:https://blog.csdn.net/mwl1711883743/article/details/81805573

JS 快速解析 URL

这篇文章会告诉如何用JS快速的解析一个URL,得到协议(protocol)、域名(host)、端口(port)、查询字符串(query)等信息。

使用 <a> 元素或 URL 对象快速解析:

function parseURL(url) {

  var a = document.createElement('a');

  a.href = url;

  // var a = new URL(url);

  return {

    source: url,

    protocol: a.protocol.replace(':', ''), 

    host: a.hostname,

    port: a.port,

    query: a.search,

    params: (function() {

      var params = {},

          seg = a.search.replace(/^\?/, '').split('&'),

          len = seg.length,

          p;

      for (var i = 0; i < len; i++) {

        if (seg[i]) {

           p = seg[i].split('=');

           params[p[0]] = p[1];

        }

      }

      return params;

   })(),

   hash: a.hash.replace('#', ''),

   path: a.pathname.replace(/^([^\/])/, '/$1')

  };

}

console.log(parseURL('https://test.com:8080/path/index.html?name=angle&age=18#top'));

转载自:http://ghmagical.com/article/page/id/SgIVenH42dyN