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中面向对象技术的模拟
Sep 25 Javascript
jQuery.extend 函数的详细用法
Jun 27 Javascript
node.js中的console.trace方法使用说明
Dec 09 Javascript
JavaScript中Math.SQRT2属性的使用详解
Jun 14 Javascript
浅谈JS中的bind方法与函数柯里化
Aug 10 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
利用百度地图API获取当前位置信息的实例
Nov 06 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
May 16 Javascript
VUE 解决mode为history页面为空白的问题
Nov 01 Javascript
vue点击页面空白处实现保存功能
Nov 06 Javascript
PHP读取远程txt文档到数组并实现遍历
Aug 25 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实现今天是星期几的几种写法
2013/09/26 PHP
PHP实现微信JS-SDK接口选择相册及拍照并上传的方法
2016/12/05 PHP
laravel学习笔记之模型事件的几种用法示例
2017/08/15 PHP
js自定义方法通过隐藏iframe实现文件下载
2013/02/21 Javascript
使用javascript:将其它类型值转换成布尔类型值的解决方法详解
2013/05/07 Javascript
js操作iframe的一些方法介绍
2013/06/25 Javascript
js拖拽一些常见的思路方法整理
2014/03/19 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
JavaScript使用function定义对象并调用的方法
2015/03/23 Javascript
Javascript控制div属性动态变化实例分析
2015/10/08 Javascript
原生JS实现层叠轮播图
2017/05/17 Javascript
快速理解 JavaScript 中的 LHS 和 RHS 查询的用法
2017/08/24 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
详解Vue CLI3 多页应用实践和源码设计
2018/08/30 Javascript
bootstrap-table formatter 使用vue组件的方法
2019/05/09 Javascript
JS操作json对象key、value的常用方法分析
2019/10/29 Javascript
Auto.JS实现抖音刷宝等刷视频app,自动点赞,自动滑屏,自动切换视频功能
2020/05/08 Javascript
python中定义结构体的方法
2013/03/04 Python
Python中的urllib模块使用详解
2015/07/07 Python
使用python语言,比较两个字符串是否相同的实例
2018/06/29 Python
浅谈python出错时traceback的解读
2020/07/15 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
python 元组和列表的区别
2020/12/30 Python
马克华菲官方商城:Mark Fairwhale
2016/09/04 全球购物
BISSELL官网:北美吸尘器第一品牌
2019/03/14 全球购物
英国在线药房:Express Chemist
2019/03/28 全球购物
美国最大的户外装备和服装购物网站:Backcountry
2019/10/15 全球购物
htmlentities() 和 htmlspecialchars()有什么区别
2015/07/01 面试题
数控技术专科生自我评价
2014/01/08 职场文书
2014年安全生产目标责任书
2014/07/23 职场文书
写给父母的感谢信
2015/01/22 职场文书
高中团支书竞选稿
2015/11/21 职场文书
2016教师政治学习心得体会
2016/01/23 职场文书
《蚂蚁和蝈蝈》教学反思
2016/02/22 职场文书
React实现动效弹窗组件
2021/06/21 Javascript