JavaScript实现数组降维详解


Posted in Javascript onJanuary 05, 2017

二维数组降维

二维数组只有两个维度,降维比较简单,也不用考虑太复杂的算法逻辑,我们看一下二维数组降维的几种方法;

遍历降维

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0; r < arr.length; r++) {
  for (var c = 0; c < arr[r].length; c++) {
    result.push(arr[r][c]);
  }
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

此方法思路简单,利用双重循环遍历二维数组中的每个元素并放到新数组中。

使用concat

利用concat方法,可以将双重循环简化为单重循环:

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = [];
for (var r = 0, result = []; r < arr.length; r++) {
  result = result.concat(arr[r]);
}
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

arr的每一个元素都是一个数组或参数,作为concat方法的参数,数组中的参数或每一个子元素又都会被独立插入进新数组。

使用apply+concat

apply方法会调用一个函数,apply方法的第一个参数会作为被调用函数的this值,apply方法的第二个参数(一个数组,或类数组的对象)会作为被调用对象的arguments值,也就是说该数组的各个元素将会依次成为被调用函数的各个参数;

var arr = [
  ['h', 'e', 'l', 'l', 'o'],
  ['m', 'y'],
  ['w', 'o', 'r', 'l', 'd'],
  ['!']
];
var result = Array.prototype.concat.apply([], arr);
console.log(result); //=>[ 'h', 'e', 'l', 'l', 'o', 'm', 'y', 'w', 'o', 'r', 'l', 'd', '!' ]

利用apply方法,只需要一行代码就可以完成二维数组降维了。

多维数组降维

多维数组就没二维数组那么简单了,因为不确定数组的深度,所以也不能进行遍历来降维,只能通过递归或者栈方法来实现。

递归

Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  this.forEach(function(val, idx) { //遍历数组
    if (Array.isArray(val)) { //判断是否为子数组
      val.forEach(arguments.callee); //为子数组则递归执行
    } else {
      result.push(val); //不为子数组则将值存入结果数组中
    }
  });
  return result; //返回result数组
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过递归的方法实现了多维数组的降维,在这里面,我有使用了原型链将方法封装进了Array原型中,可以直接在数组方法中调用。

栈方法

Array.prototype.deepFlatten = function() {
  var result = []; //定义保存结果的数组
  var stack = this; //将数组放入栈中
  while (stack.length !== 0) { //如果栈不为空,则循环遍历
    var val = stack.pop(); //取出最后一个值
    if (Array.isArray(val)) { //判断是不是数组
      stack = stack.concat(val); //如果是数组就将拼接入栈中
    } else {
      result.unshift(val); //如果不是数组就将其取出来放入结果数组中
    }
  }
  return result;
}
var arr = [2, 3, [2, 2],
  [3, 'f', ['w', 3]], { "name": 'Tom' }
];
console.log(arr.deepFlatten()); //=>[ 2, 3, 2, 2, 3, 'f', 'w', 3, { name: 'Tom' } ]

这是通过栈方法,建立了一个栈,将数组的内容存进去,然后逐个取出来,如果取出来的是个数组,就将这个数组打散拼接进栈中,在出栈一个,这样循环。

多维数组降维的方法也可以降维二维数组,但是有点大材小用,还是用对的方法做对的事才是最好的!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
HTML-CSS群中单选引发的“事件”
Mar 05 Javascript
JavaScript 函数式编程的原理
Oct 16 Javascript
javascript 动态生成私有变量访问器
Dec 06 Javascript
jQuery 表单验证扩展代码(二)
Oct 20 Javascript
jQuery EasyUI API 中文文档 - Form表单
Oct 06 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
Oct 06 Javascript
推荐10个超棒的jQuery工具提示插件
Oct 11 Javascript
jQuery自定义动画函数实例详解(附demo源码)
Dec 10 Javascript
AngularJS基础 ng-keyup 指令简单示例
Aug 02 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
vue下使用nginx刷新页面404的问题解决
Aug 02 Javascript
jQuery解析返回的xml和json方法详解
Jan 05 #Javascript
使用snowfall.jquery.js实现爱心满屏飞的效果
Jan 05 #Javascript
jQuery实现动态文字搜索功能
Jan 05 #Javascript
JS实现HTML标签转义及反转义
Apr 14 #Javascript
jQuery基于ajax操作json数据简单示例
Jan 05 #Javascript
js将字符串中的每一个单词的首字母变为大写其余均为小写
Jan 05 #Javascript
如何提高Dom访问速度
Jan 05 #Javascript
You might like
php 方便水印和缩略图的图形类
2009/05/21 PHP
php 传值赋值与引用赋值的区别
2010/12/29 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php中mysql连接方式PDO使用详解
2015/02/25 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
php fread函数使用方法总结
2019/05/28 PHP
js 函数的执行环境和作用域链的深入解析
2009/11/01 Javascript
js实现幻灯片播放图片示例代码
2013/11/07 Javascript
jquery 显示*天*时*分*秒实现时间计时器
2014/05/07 Javascript
JS数组(Array)处理函数整理
2014/12/07 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
vue+element-ui动态生成多级表头的方法
2018/08/28 Javascript
Vue+axios+WebApi+NPOI导出Excel文件实例方法
2019/06/05 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
在Python下尝试多线程编程
2015/04/28 Python
解析Python编程中的包结构
2015/10/25 Python
python 采集中文乱码问题的完美解决方法
2016/09/27 Python
Python yield 使用方法浅析
2017/05/20 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python 实现文件打包、上传与校验的方法
2019/02/13 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
Selenium alert 弹窗处理的示例代码
2020/08/06 Python
15个Pythonic的代码示例(值得收藏)
2020/10/29 Python
简历自荐信
2013/12/02 职场文书
房地产融资计划书
2014/01/10 职场文书
演讲稿开场白台词
2014/08/25 职场文书
单位授权委托书范本
2014/09/26 职场文书
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
九九重阳节标语
2014/10/07 职场文书
个人催款函范文
2015/06/23 职场文书
护士工作心得体会
2016/01/25 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
创业计划书之甜品店
2019/09/18 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
mongoDB数据库索引快速入门指南
2022/03/23 MongoDB