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 相关文章推荐
Stop SQL Server
Jun 21 Javascript
jQuery 表单验证插件formValidation实现个性化错误提示
Jun 23 Javascript
什么是JavaScript
Aug 13 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
浅谈Javascript中深复制
Dec 01 Javascript
jQuery实现流动虚线框的方法
Jan 29 Javascript
jQuery删除一个元素后淡出效果展示删除过程的方法
Mar 18 Javascript
jQuery实现批量判断表单中文本框非空的方法(2种方法)
Dec 09 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
详解Angular CLI + Electron 开发环境搭建
Jul 20 Javascript
详解微信小程序之scroll-view的flex布局问题
Jan 16 Javascript
微信小程序接入腾讯云验证码的方法步骤
Jan 07 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
用PHP实现的随机广告显示代码
2007/06/14 PHP
PHP setcookie指定domain参数后,在IE下设置cookie失效的解决方法
2011/09/09 PHP
php异步多线程swoole用法实例
2014/11/14 PHP
PHP生成腾讯云COS接口需要的请求签名
2018/05/20 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
php intval函数用法总结
2019/04/14 PHP
js滚动条多种样式,推荐
2007/02/05 Javascript
jquery 上下滚动广告
2009/06/17 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
使用VS开发 Node.js指南
2015/01/06 Javascript
Google 地图类型详解及示例代码
2016/08/06 Javascript
JS实现字符串转驼峰格式的方法
2016/12/16 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
javascript过滤数组重复元素的实现方法
2017/05/03 Javascript
vue.js 初体验之Chrome 插件开发实录
2017/05/13 Javascript
深入探究node之Transform
2017/07/20 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
layui监听单元格编辑前后交互的例子
2019/09/16 Javascript
SSM+layUI 根据登录信息显示不同的页面方法
2019/09/20 Javascript
vue中的计算属性和侦听属性
2020/11/06 Javascript
vue element el-transfer增加拖拽功能
2021/01/15 Vue.js
Python中max函数用法实例分析
2015/07/17 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
Python 获得13位unix时间戳的方法
2017/10/20 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Django自定义列表 models字段显示方式
2020/04/03 Python
Python如何向SQLServer存储二进制图片
2020/06/08 Python
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
Lookfantastic台湾:英国彩妆美发保养购物网
2018/03/26 全球购物
英国在线潜水商店:Simply Scuba
2019/03/25 全球购物
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
ORACLE第二个十问
2013/12/14 面试题
大课间体育活动方案
2014/03/12 职场文书
检讨书之工作不认真
2019/08/14 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL