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 相关文章推荐
分享一个我自己写的ToolTip提示插件(附源码)
Jan 20 Javascript
Js与Jq获取浏览器和对象值的方法
Mar 18 Javascript
CSS3 3D 技术手把手教你玩转
Sep 02 Javascript
Node.js中.pfx后缀文件的处理方法
Mar 10 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
Angular2.0实现modal对话框的方法示例
Feb 18 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
vue项目中添加单元测试的方法
Jul 21 Javascript
详解webpack模块加载器兼打包工具
Sep 11 Javascript
新年快乐! javascript实现超级炫酷的3D烟花特效
Jan 30 Javascript
jquery操作checkbox的常用方法总结【附测试源码下载】
Jun 10 jQuery
layer关闭弹出窗口触发表单提交问题的处理方法
Sep 25 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/06/03 PHP
PHP判断搜索引擎蜘蛛并自动记忆到文件的代码
2012/02/04 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
2014/06/05 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
基于laravel Request的所有方法详解
2019/09/29 PHP
浅析PHP中json_encode与json_decode的区别
2020/07/15 PHP
让你的PHP,APACHE,NGINX支持大文件上传
2021/03/09 PHP
一个用js实现控制台控件的代码
2007/09/04 Javascript
Javascript 生成指定范围数值随机数
2009/01/09 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
鼠标滑上去后图片放大浮出效果的js代码
2011/05/28 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
jquery 取子节点及当前节点属性值
2014/07/25 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
浅谈Vue.js 中的 v-on 事件指令的使用
2018/11/25 Javascript
antd组件Upload实现自己上传的实现示例
2018/12/18 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
jQuery实现移动端下拉展现新的内容回弹动画
2020/06/24 jQuery
python逐行读取文件内容的三种方法
2014/01/20 Python
K-近邻算法的python实现代码分享
2017/12/09 Python
NumPy 如何生成多维数组的方法
2018/02/05 Python
Python从零开始创建区块链
2018/03/06 Python
Python-接口开发入门解析
2019/08/01 Python
如何打包Python Web项目实现免安装一键启动的方法
2020/05/21 Python
英国领先的运动物理治疗供应公司:Vivomed
2018/07/14 全球购物
大学生个人求职信范文
2013/09/21 职场文书
《美丽的公鸡》教学反思
2014/02/25 职场文书
关于环保的演讲稿
2014/05/10 职场文书
消防志愿者活动方案
2014/08/23 职场文书
2015年度党员自我评价范文
2015/03/03 职场文书
小学生一年级(书信作文)
2019/08/13 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
浅谈node.js中间件有哪些类型
2021/04/29 Javascript