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 相关文章推荐
JavaScript 工具库 Cloudgamer JavaScript Library v0.1 发布
Oct 29 Javascript
js 页面刷新location.reload和location.replace的区别小结
Dec 24 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
JavaScript实现的使用键盘控制人物走动实例
Aug 27 Javascript
jquery实现导航固定顶部的效果仿蘑菇街
Oct 22 Javascript
嵌入式iframe子页面与父页面js通信的方法
Jan 20 Javascript
javascript内置对象操作详解
Feb 04 Javascript
使用jspdf生成pdf报表
Jul 03 Javascript
JavaScript实现星星等级评价功能
Mar 22 Javascript
使用jQuery.Pin垂直滚动时固定导航
May 24 jQuery
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 Javascript
vue中keep-alive内置组件缓存的实例代码
Apr 16 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动态创建Web站点的方法
2011/08/14 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
给PHP开发者的编程指南 第一部分降低复杂程度
2016/01/18 PHP
详解PHP的Yii框架中组件行为的属性注入和方法注入
2016/03/18 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
客户端脚本中常常出现的一些问题和调试技巧
2007/01/09 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
jQuery each()小议
2010/03/18 Javascript
js事件(Event)知识整理
2012/10/11 Javascript
用nodejs写的一个简单项目打包工具
2013/05/11 NodeJs
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
DWR3 访问WEB元素的两种方法实例详解
2017/01/03 Javascript
nodejs Assert中equal(),strictEqual(),deepEqual(),strictDeepEqual()比较
2017/09/18 NodeJs
vue复合组件实现注册表单功能
2017/11/06 Javascript
JavaScript实现邮箱后缀提示功能的示例代码
2018/12/13 Javascript
JavaScript语句错误throw、try及catch实例解析
2020/08/18 Javascript
node使用async_hooks模块进行请求追踪
2021/01/28 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
python获取目录下所有文件的方法
2015/06/01 Python
python实现的AES双向对称加密解密与用法分析
2017/05/02 Python
python 编写简单网页服务器的实例
2018/06/01 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
Python tensorflow实现mnist手写数字识别示例【非卷积与卷积实现】
2019/12/19 Python
浅谈ROC曲线的最佳阈值如何选取
2020/02/28 Python
Python中有几个关键字
2020/06/04 Python
基于HTML5 Canvas 实现商场监控实例详解
2017/11/20 HTML / CSS
Canvas globalCompositeOperation
2018/12/18 HTML / CSS
介绍一些UNIX常用简单命令
2014/11/11 面试题
县级文明单位申报材料
2014/05/23 职场文书
2014年语文教学工作总结
2014/12/17 职场文书
2016元旦晚会主持词
2015/07/01 职场文书
2015年秋季开学典礼校长致辞
2015/07/16 职场文书
2016年小学生清明节广播稿
2015/12/17 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
2022/03/19 Oracle
Java中的Kotlin 内部类原理
2022/06/16 Java/Android