JavaScript常用数组算法小结


Posted in Javascript onFebruary 13, 2016

今天抽点时间把javascript中的一些常用的数组算法做一下总结,以方便大家面试笔试或者日常开发过程中用到。其中部分算法来自网络,这里做了下汇总整理。文章末尾我会把参考的来源附上去,如果直接看算法比较枯燥的可以到参考文献里去看,讲解的非常不错。

一、数组去重

方法1:

//利用数组的indexOf方法
function unique (arr) {
 var result = []; 
 for (var i = 0; i < arr.length; i++)
 {
  if (result.indexOf(arr[i]) == -1) result.push(arr[i]);
 }
 return result;
}

方法2:

//利用hash表,可能会出现字符串和数字一样的话出错,如var a = [1, 2, 3, 4, '3', 5],会返回[1, 2, 3, 4, 5]
function unique (arr){
  var hash = {},result = []; 
  for(var i = 0; i < arr.length; i++)
  {
    if (!hash[arr[i]]) 
    {
      hash[arr[i]] = true; 
      result.push(arr[i]); 
    }
  }
  return result;
}

方法3:

//排序后比较相邻,如果一样则放弃,否则加入到result。会出现与方法2一样的问题,如果数组中存在1,1,'1'这样的情况,则会排错

function unique (arr) {
  arr.sort();
  var result=[arr[0]];
  for(var i = 1; i < arr.length; i++){
    if( arr[i] !== arr[i-1]) {
      result.push(arr[i]);
    }
  }
  return result;
}

方法4:

//最简单但是效率最低的算法,也不会出现方法2和方法3出现的bug
function unique (arr) {
  if(arr.length == 0) return;
  var result = [arr[0]], isRepeate;
  for( var i = 0, j = arr.length; i < j; i++ ){
    isRepeate = false;
    for( var k = 0, h = result.length; k < h; k++){
      if(result[k] === arr[i]){
        isRepeate = true;
        break;
      }
      if(k == h) break;
    }
    if( !isRepeate ) result.push(arr[i]);
  }
  return result;
}

方法5:

//此方法充分利用了递归和indexOf方法,感谢网友@真爱像深蓝
var unique = function (arr, newArr) {
   var num;

   if (-1 == arr.indexOf(num = arr.shift())) newArr.push(num);

   arr.length && unique(arr, newArr);
}

二、数组顺序扰乱

方法1:

//每次随机抽一个数并移动到新数组中
function shuffle(array) {
  var copy = [],
    n = array.length,
    i;
  // 如果还剩有元素则继续。。。
  while (n) {
    // 随机抽取一个元素
    i = Math.floor(Math.random() * array.length);
    // 如果这个元素之前没有被选中过。。
    if (i in array) {
      copy.push(array[i]);
      delete array[i];
      n--;
    }
  }
  return copy;
};

方法2:

//跟方法1类似,只不过通过splice来去掉原数组已选项
function shuffle(array) {
  var copy = [],
    n = array.length,
    i;
  // 如果还剩有元素。。
  while (n) {
    // 随机选取一个元素
    i = Math.floor(Math.random() * n--);
    // 移动到新数组中
    copy.push(array.splice(i, 1)[0]);
  }
  return copy;
}

方法3:

//前面随机抽数依次跟末尾的数交换,后面依次前移,即:第一次前n个数随机抽一个跟第n个交换,第二次前n-1个数跟第n-1个交换,依次类推。
function shuffle(array) {

var m = array.length,
  t, i;
// 如果还剩有元素…
while (m) {
  // 随机选取一个元素…
  i = Math.floor(Math.random() * m--);
  // 与当前元素进行交换
  t = array[m];
  array[m] = array[i];
  array[i] = t;
}
return array; }

三、数组判断

方法1:

//自带的isArray方法
var array6 = [];
Array.isArray(array6 );//true

方法2:

//利用instanceof运算符
   var array5 = [];
   array5 instanceof Array;//true

方法3:

//利用toString的返回值
   function isArray(o) {
     return Object.prototype.toString.call(o) === '[object Array]'; 
   }

四、数组求交集

方法1:

//利用filter和数组自带的indexOf方法
   array1.filter(function(n) {
   return array2.indexOf(n) != -1 });

五、数组求并集

方法1:

//方法原理:连接两个数组并去重
   function arrayUnique(array) {
     var a = array.concat(array2);
     for(var i=0; i<a.length; ++i) {
       for(var j=i+1; j<a.length; ++j) {
         if(a[i] === a[j])
           a.splice(j--, 1);
       }
     }
     return a;
   };

六、数组求差集

方法1:

//利用filter和indexOf方法
   Array.prototype.diff = function(a) {
     return this.filter(function(i) {
      return a.indexOf(i) < 0;
      });
};

上面的方法1只能求出一个数组相对另一个数组的差集,比如array1.diff(array2),只能求出array1相对array2的差集,如果希望将两个数组不同的值都获取到,可以array1.diff(array2).concat(array2.diff(array1)),也可以使用方法2

方法2

var array1 = new Array(55,55,88,6,68,109,55,33,6,2,1);
   var array2 = [55,88,99,69,109,55,33,6,2,1];
   var diffArr = array1.concat(array2);
   
   var diff = diffArr.filter(function(i) {
           return array1.indexOf(i) < 0||array2.indexOf(i) < 0;
       });
   
   console.log( diff );

暂时汇总了这点儿,有待后续补充。欢迎大家补充,如有问题,敬请留言,共同探讨和进步,^_^

Javascript 相关文章推荐
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
May 30 Javascript
JSONP 跨域共享信息
Aug 16 Javascript
javascript实现简单的Map示例介绍
Dec 23 Javascript
微信分享的标题、缩略图、连接及描述设置方法
Oct 14 Javascript
js的回调函数详解
Jan 05 Javascript
Struts2+jquery.form.js实现图片与文件上传的方法
May 05 Javascript
JavaScript编程中实现对象封装特性的实例讲解
Jun 24 Javascript
微信小程序 swiper组件轮播图详解及实例
Nov 16 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
js prototype深入理解及应用实例分析
Nov 25 Javascript
vue实现扫码功能
Jan 17 Javascript
JavaScript实现一键复制内容剪贴板
Jul 23 Javascript
Javascript 字符串模板的简单实现
Feb 13 #Javascript
javascript基础知识分享之类与函数化
Feb 13 #Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 #Javascript
js HTML5 Ajax实现文件上传进度条功能
Feb 13 #Javascript
js随机生成26个大小写字母
Feb 12 #Javascript
jquery实现具有嵌套功能的选项卡
Feb 12 #Javascript
基于jquery实现动态竖向柱状条特效
Feb 12 #Javascript
You might like
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
一些常用的php简单命令代码集锦
2007/09/24 PHP
PHP写的求多项式导数的函数代码
2012/07/04 PHP
一个简单的网页密码登陆php代码
2012/07/17 PHP
ECSHOP在PHP5.5及高版本上报错的解决方法
2015/08/31 PHP
Mootools 1.2教程 定时器和哈希简介
2009/09/15 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
JS target与currentTarget区别说明
2011/08/28 Javascript
js Calender控件使用详解
2015/01/05 Javascript
浅谈js对象的创建和对6种继承模式的理解和遐想
2016/10/16 Javascript
实现easyui的datagrid导出为excel的示例代码
2016/11/10 Javascript
js实现交通灯效果
2017/01/13 Javascript
JavaScript中的普通函数和箭头函数的区别和用法详解
2017/03/21 Javascript
springMVC + easyui + $.ajaxFileUpload实现文件上传注意事项
2017/04/23 Javascript
Js自定义多选框效果的实例代码
2017/07/05 Javascript
vue-resource调用promise取数据方式详解
2017/07/21 Javascript
jQuery 查找元素操作实例小结
2019/10/02 jQuery
Python中logging模块的用法实例
2014/09/29 Python
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
Python根据指定日期计算后n天,前n天是哪一天的方法
2018/05/29 Python
Python如何调用JS文件中的函数
2019/08/16 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
pyqt5 textEdit、lineEdit操作的示例代码
2020/08/12 Python
python程序实现BTC(比特币)挖矿的完整代码
2021/01/20 Python
使用CSS变量实现炫酷惊人的悬浮效果
2019/04/26 HTML / CSS
HTML5+css3:3D旋转木马效果相册
2017/01/03 HTML / CSS
基于canvas使用贝塞尔曲线平滑拟合折线段的方法
2018/01/10 HTML / CSS
Chicco婴儿用品美国官网:汽车座椅、婴儿推车、高脚椅等
2018/11/05 全球购物
作为网站管理者应当如何防范XSS
2014/08/16 面试题
大学生学习2014全国两会心得体会
2014/03/13 职场文书
外出学习心得体会范文
2016/01/18 职场文书
公司晚会主持词
2019/04/17 职场文书
SpringBoot工程下使用OpenFeign的坑及解决
2021/07/02 Java/Android