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 相关文章推荐
jQuery前台数据获取实现代码
Mar 16 Javascript
JavaScript实现GriwView单列全选(自写代码)
May 13 Javascript
JavaScript调用客户端的可执行文件(示例代码)
Nov 28 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
jQuery基于ID调用指定iframe页面内的方法
Jul 06 Javascript
JS库particles.js创建超炫背景粒子插件(附源码下载)
Sep 13 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
js隐式转换的知识实例讲解
Sep 28 Javascript
vue封装一个简单的div框选时间的组件的方法
Jan 06 Javascript
vue实现滑动超出指定距离回顶部功能
Jul 31 Javascript
js代码实现轮播图
May 04 Javascript
VUE Elemen-ui之穿梭框使用方法详解
Jan 19 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 开发工具
2006/12/06 PHP
排序算法之PHP版快速排序、冒泡排序
2014/04/09 PHP
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
node.js中的fs.truncate方法使用说明
2014/12/15 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
Angularjs中controller的三种写法分享
2016/09/21 Javascript
nodejs个人博客开发第七步 后台登陆
2017/04/12 NodeJs
javascript 开发之百度地图使用到的js函数整理
2017/05/19 Javascript
js事件委托和事件代理案例分享
2017/07/25 Javascript
JSON创建键值对(key是中文或者数字)方式详解
2017/08/24 Javascript
js实现会跳动的日历效果(完整实例)
2017/10/18 Javascript
4个顶级JavaScript高级文本编辑器
2018/10/10 Javascript
angular 服务随记小结
2019/05/06 Javascript
react 中父组件与子组件双向绑定问题
2019/05/20 Javascript
微信小程序实现图片翻转效果的实例代码
2019/09/20 Javascript
es6函数之尾调用优化实例分析
2020/04/25 Javascript
vue利用全局导航守卫作登录后跳转到未登录前指定页面的实例代码
2020/05/19 Javascript
Vue绑定用户接口实现代码示例
2020/11/04 Javascript
Python的Flask框架标配模板引擎Jinja2的使用教程
2016/07/12 Python
python实现朴素贝叶斯分类器
2018/03/28 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
numpy库与pandas库axis=0,axis= 1轴的用法详解
2019/05/27 Python
Python将二维列表list的数据输出(TXT,Excel)
2020/04/23 Python
Python中实现输入一个整数的案例
2020/05/03 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
美国复古街头服饰精品店:Need Supply Co.
2017/02/22 全球购物
英国图书音像网站:Hive.co.uk(图书、电子书、DVD、蓝光、音乐CD等)
2017/10/16 全球购物
澳大利高级泳装品牌:Bondi Born
2018/05/23 全球购物
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
素质拓展训练感想
2015/08/07 职场文书