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 相关文章推荐
input 和 textarea 输入框最大文字限制的jquery插件
Oct 27 Javascript
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
点击显示指定元素隐藏其他同辈元素的方法
Feb 19 Javascript
EasyUI中实现form表单提交的示例分享
Mar 01 Javascript
JS实现黑色大气的二级导航菜单效果
Sep 18 Javascript
jQuery配合coin-slider插件制作幻灯片效果的流程解析
May 13 Javascript
jQuery实现复制到粘贴板功能
Feb 11 Javascript
angularjs 获取默认选中的单选按钮的value方法
Feb 28 Javascript
vue组件之间通信实例总结(点赞功能)
Dec 05 Javascript
Node.js 路由的实现方法
Jun 05 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
html5 录制mp3音频支持采样率和比特率设置
Jul 15 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
第二节--PHP5 的对象模型
2006/11/16 PHP
PHP+JS无限级可伸缩菜单详解(简单易懂)
2007/01/02 PHP
分享一段php获取linux服务器状态的代码
2014/05/27 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
php和editplus正则表达式去除空白行
2015/04/17 PHP
php通过baihui网API实现读取word文档并展示
2015/06/22 PHP
js基于面向对象实现网页TAB选项卡菜单效果代码
2015/09/09 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
基于jQuery实现的扇形定时器附源码下载
2015/10/20 Javascript
JavaScrip常见的一些算法总结
2015/12/28 Javascript
Node.js本地文件操作之文件拷贝与目录遍历的方法
2016/02/16 Javascript
AngularJS基础 ng-model 指令详解及示例代码
2016/08/02 Javascript
使用Angular CLI从蓝本生成代码详解
2018/03/24 Javascript
Vue登录注册并保持登录状态的方法
2018/08/17 Javascript
layui表单提交到后台自动封装到实体类的方法
2019/09/12 Javascript
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
一篇文章看懂JavaScript中的回调
2021/01/05 Javascript
Python引用(import)文件夹下的py文件的方法
2014/08/26 Python
Python中尝试多线程编程的一个简明例子
2015/04/07 Python
Python实现提取文章摘要的方法
2015/04/21 Python
Python实现配置文件备份的方法
2015/07/30 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
Python实现计算对象的内存大小示例
2019/07/10 Python
python GUI模拟实现计算器
2020/06/22 Python
CSS3 media queries + jQuery实现响应式导航
2016/09/30 HTML / CSS
加拿大在线隐形眼镜和眼镜店:VisionPros
2019/10/06 全球购物
SmartBuyGlasses荷兰:购买太阳镜和眼镜
2020/03/16 全球购物
英国领先的高级美容和在线皮肤诊所:Face the Future
2020/06/17 全球购物
护理学中专毕业生求职信
2013/11/11 职场文书
出国导师推荐信
2015/03/25 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
古诗之爱国古诗5首
2019/09/20 职场文书
Nginx安装完成没有生成sbin目录的解决方法
2021/03/31 Servers
python爬取新闻门户网站的示例
2021/04/25 Python
HTML5简单实现添加背景音乐的几种方法
2021/05/12 HTML / CSS