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 动态加载 css 方法总结
Jul 11 Javascript
写出更好的JavaScript之undefined篇(上)
Nov 22 Javascript
html5 canvas js(数字时钟)实例代码
Dec 23 Javascript
JS实现控制表格行文本对齐的方法
Mar 30 Javascript
JavaScript之Object类型介绍
Apr 01 Javascript
BootStrap制作导航条实例代码
May 06 Javascript
JavaScript实现简单的双色球(实例讲解)
Jul 31 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
如何解决webpack-dev-server代理常切换问题
Jan 09 Javascript
vue实现固定位置显示功能
May 30 Javascript
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
JavaScript复制变量三种方法实例详解
Jan 09 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的变量总结 新手推荐
2011/04/18 PHP
php判断并删除空目录及空子目录的方法
2015/02/11 PHP
PHP+MySQL统计该库中每个表的记录数并按递减顺序排列的方法
2016/02/15 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
js 动态加载事件的几种方法总结
2013/12/25 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
JS实现设置ff与ie元素绝对位置的方法
2016/03/08 Javascript
基于angularjs实现图片放大镜效果
2016/08/31 Javascript
Angular CLI 安装和使用教程
2017/09/13 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
node前端模板引擎Jade之标签的基本写法
2018/05/11 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
如何用JS模拟实现数组的map方法
2020/07/30 Javascript
[53:20]2018DOTA2亚洲邀请赛 4.1 小组赛 A组加赛 VG vs OG
2018/04/03 DOTA
Python合并字典键值并去除重复元素的实例
2016/12/18 Python
python障碍式期权定价公式
2019/07/19 Python
pywinauto自动化操作记事本
2019/08/26 Python
详解python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'如何解决
2019/08/27 Python
利用Tensorboard绘制网络识别准确率和loss曲线实例
2020/02/15 Python
tensorflow常用函数API介绍
2020/04/19 Python
Python内置方法和属性应用:反射和单例(推荐)
2020/06/19 Python
Python爬虫爬取博客实现可视化过程解析
2020/06/29 Python
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
Java中采用什么结构来捕获、处理异常?各子句的顺序、功能如何
2013/10/07 面试题
应届大专毕业生个人自荐信
2013/09/22 职场文书
艺术系应届生的自我评价
2013/10/19 职场文书
致百米运动员广播稿
2014/01/29 职场文书
《童趣》教学反思
2014/02/19 职场文书
中学生操行评语大全
2014/04/24 职场文书
高中生国庆节演讲稿范文2014
2014/09/21 职场文书
机关班子查摆问题及整改措施
2014/10/28 职场文书
Axios取消重复请求的方法实例详解
2021/06/15 Javascript
基于Python实现流星雨效果的绘制
2022/03/18 Python