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 相关文章推荐
JavaScript通过join函数连接数组里所有元素的方法
Mar 20 Javascript
JQuery替换DOM节点的方法
Jun 11 Javascript
JavaScript入门基础
Aug 12 Javascript
JS实现黑客帝国文字下落效果
Sep 01 Javascript
jQuery zclip插件实现跨浏览器复制功能
Nov 02 Javascript
jquery插件uploadify实现带进度条的文件批量上传
Dec 13 Javascript
jQuery插件HighCharts实现气泡图效果示例【附demo源码】
Mar 13 Javascript
原生js二级联动效果
Jun 20 Javascript
Three.js加载外部模型的教程详解
Nov 10 Javascript
bootstrap fileinput插件实现预览上传照片功能
Jan 23 Javascript
基于javascript实现日历功能原理及代码实例
May 07 Javascript
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
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读取文件内容至字符串中,同时去除换行、空行、行首行尾空格(Zjmainstay原创)
2012/07/31 PHP
使用PHP Socket写的POP3类
2013/10/30 PHP
php使用codebase生成随机数
2014/03/25 PHP
Yii2实现中国省市区三级联动实例
2017/02/08 PHP
PhpStorm连接服务器并实现自动上传功能
2020/12/09 PHP
JS处理VBArray的函数使用说明
2008/05/11 Javascript
Javascript 文件夹选择框的两种解决方案
2009/07/01 Javascript
jqPlot jquery的页面图表绘制工具
2009/07/25 Javascript
javascript 定义新对象方法
2010/02/20 Javascript
Jquery 实现Tab效果 思路是js思路
2010/03/02 Javascript
jBox 2.3基于jquery的最新多功能对话框插件 常见使用问题解答
2011/11/10 Javascript
innerText和textContent对比及使用介绍
2013/02/27 Javascript
使用js正则控制input标签只允许输入的值
2013/07/29 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
微信小程序 条件渲染详解
2016/10/09 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
2017/07/20 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
laravel-admin 与 vue 结合使用实例代码详解
2019/06/04 Javascript
[02:50]【扭转乾坤,只此一招】DOTA2全新版本永雾林渊开启新篇章
2020/12/24 DOTA
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
python程序控制NAO机器人行走
2019/04/29 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python实现文件的分割与合并
2019/08/29 Python
Django实现简单的分页功能
2021/02/22 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
大龄毕业生求职别忘职业规划
2014/03/11 职场文书
大学生个人求职信
2014/06/02 职场文书
县长“四风”对照检查材料思想汇报
2014/10/05 职场文书
2015年后备干部工作总结
2015/05/15 职场文书
导游词之包公祠
2019/11/25 职场文书