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入门教程(5) js Screen屏幕对象
Jan 31 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
May 15 Javascript
extjs4 treepanel动态改变行高度示例
Dec 17 Javascript
使用jquery操作session方法分享
Jan 22 Javascript
关于Iframe父页面与子页面之间的相互调用
Nov 22 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
Feb 17 Javascript
Vue框架中正确引入JS库的方法介绍
Jul 30 Javascript
jQuery实现checkbox即点即改批量删除及中间遇到的坑
Nov 11 jQuery
Vue2.0学习系列之项目上线的方法步骤(图文)
Sep 25 Javascript
javascript之分片上传,断点续传的实际项目实现详解
Sep 05 Javascript
JavaScript进阶(一)变量声明提升实例分析
May 09 Javascript
js实现限定区域范围拖拉拽效果
Nov 20 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
数据库中排序的对比及使用条件详解
2012/02/23 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
php+redis实现注册、删除、编辑、分页、登录、关注等功能示例
2017/02/15 PHP
微信小程序发送订阅消息的方法(php 为例)
2019/10/30 PHP
JavaScript 在线压缩和格式化收藏
2009/01/16 Javascript
JavaScript 异步调用框架 (Part 1 - 问题 &amp; 场景)
2009/08/03 Javascript
JavaScript 动态添加表格行 使用模板、标记
2009/10/24 Javascript
分享8款优秀的 jQuery 加载动画和进度条插件
2012/10/24 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
js控制浏览器全屏示例代码
2014/02/20 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
基于JS实现的笛卡尔乘积之商品发布
2016/05/13 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
JS字符串false转boolean的方法(推荐)
2017/03/08 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
运用js实现图层拖拽的功能
2019/05/24 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
在vue中实现禁止回退上一步,路由不存历史记录
2020/07/22 Javascript
python实现带错误处理功能的远程文件读取方法
2015/04/29 Python
numpy 计算两个数组重复程度的方法
2018/11/07 Python
详解Python正则表达式re模块
2019/03/19 Python
pytorch 自定义卷积核进行卷积操作方式
2019/12/30 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
班班通校本培训方案
2014/03/12 职场文书
实习生工作证明范本
2014/09/14 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
公司酒会主持词
2015/07/02 职场文书
2019各种承诺书范文
2019/06/24 职场文书
导游词之绍兴柯岩古镇
2020/01/09 职场文书
原生CSS实现文字无限轮播的通用方法
2021/03/30 HTML / CSS
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS
基于Python实现nc批量转tif格式
2022/08/14 Python