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 相关文章推荐
PPK 谈 JavaScript 的 this 关键字 [翻译]
Sep 29 Javascript
jQuery-Tools-overlay 使用介绍
Jul 14 Javascript
js的alert弹出框出现乱码解决方案
Sep 02 Javascript
CSS+jQuery实现的一个放大缩小动画效果
Sep 24 Javascript
jQuery手动点击实现图片轮播特效
Apr 20 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)
Feb 16 Javascript
9个让JavaScript调试更简单的Console命令
Nov 14 Javascript
vue2.0项目中使用Ueditor富文本编辑器示例代码
Aug 14 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
JavaScript实现数字前补“0”的五种方法示例
Jan 03 Javascript
Vue使用zTree插件封装树组件操作示例
Apr 25 Javascript
vue $mount 和 el的区别说明
Sep 11 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
自动分页的不完整解决方案
2007/01/12 PHP
php获取url字符串截取路径的文件名和扩展名的函数
2010/01/22 PHP
浅析php过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
windows7下安装php的php-ssh2扩展教程
2014/07/04 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
AngularJS iframe跨域打开内容时报错误的解决办法
2015/01/26 Javascript
JavaScript基础函数整理汇总
2015/01/30 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
将form表单通过ajax实现无刷新提交的简单实例
2016/10/12 Javascript
使用JavaScript解决网页图片拉伸问题(推荐)
2016/11/25 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
基于D3.js实现时钟效果
2018/07/17 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
react基本安装与测试示例
2020/04/27 Javascript
Python sys.path详细介绍
2013/10/17 Python
python实现电子词典
2020/04/23 Python
利用Python爬虫给孩子起个好名字
2017/02/14 Python
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python 十六进制整数与ASCii编码字符串相互转换方法
2018/07/09 Python
python 常用的基础函数
2018/07/10 Python
Pandas 解决dataframe的一列进行向下顺移问题
2019/12/27 Python
Django 后台带有字典的列表数据与页面js交互实例
2020/04/03 Python
Pandas读取csv时如何设置列名
2020/06/02 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
使用css3制作动感导航条示例
2014/01/26 HTML / CSS
俄罗斯园林植物网上商店:Garshinka
2020/07/16 全球购物
幼儿园安全责任书
2014/04/14 职场文书
庆六一活动总结
2014/08/29 职场文书
中小学生学籍证明
2014/10/25 职场文书
2016年学习贯彻十八届五中全会精神心得体会
2016/01/05 职场文书
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
java代码实现空间切割
2022/01/18 Java/Android
MySQL学习之基础命令实操总结
2022/03/19 MySQL