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 相关文章推荐
js综合应用实例简单的表格统计
Sep 03 Javascript
JavaScript中双叹号!!作用示例介绍
Sep 21 Javascript
ionic2 tabs 图标自定义实例
Mar 08 Javascript
jquery实现静态搜索功能(可输入搜索文字)
Mar 28 jQuery
AngularJS 中的数据源的循环输出
Oct 12 Javascript
jq.ajax+php+mysql实现关键字模糊查询(示例讲解)
Jan 02 Javascript
vue弹窗消息组件的使用方法
Sep 24 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
Aug 20 Javascript
详解一个基于react+webpack的多页面应用配置
Jan 21 Javascript
vue列表数据发生变化指令没有更新问题及解决方法
Jan 16 Javascript
vue相同路由跳转强制刷新该路由组件操作
Aug 05 Javascript
你不知道的 TypeScript 高级类型(小结)
Aug 28 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
从康盛产品(discuz)提取出来的模板类
2011/06/28 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
php版微信小店API二次开发及使用示例
2016/11/12 PHP
js计数器代码
2006/11/04 Javascript
Prototype使用指南之selector.js
2007/01/10 Javascript
jquery tab插件精简版分享
2011/09/10 Javascript
关于backbone url请求中参数带有中文存入数据库是乱码的快速解决办法
2016/06/13 Javascript
JQuery手速测试小游戏实现思路详解
2016/09/20 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
javascript 动态生成css代码的两种方法
2017/03/17 Javascript
elementUI vue this.$confirm 和el-dialog 弹出框 移动 示例demo
2019/07/03 Javascript
解决包含在label标签下的checkbox在ie8及以下版本点击事件无效果兼容的问题
2019/10/27 Javascript
微信小程序接入腾讯云验证码的方法步骤
2020/01/07 Javascript
vue3+typescript实现图片懒加载插件
2020/10/26 Javascript
Vue实现图书管理小案例
2020/12/03 Vue.js
python多线程编程中的join函数使用心得
2014/09/02 Python
python模块之sys模块和序列化模块(实例讲解)
2017/09/13 Python
python的re正则表达式实例代码
2018/01/24 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
python 正确保留多位小数的实例
2018/07/16 Python
python截取两个单词之间的内容方法
2018/12/25 Python
python的依赖管理的实现
2019/05/14 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
wxPython实现带颜色的进度条
2019/11/19 Python
python可视化text()函数使用详解
2020/02/11 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
Python爬虫防封ip的一些技巧
2020/08/06 Python
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
同事打架检讨书
2014/02/04 职场文书
学习型班组申报材料
2014/05/31 职场文书
大学竞选班干部演讲稿
2014/08/21 职场文书
中学生关于梦想的演讲稿
2014/08/22 职场文书
安全先进班组材料
2014/12/26 职场文书
工会工作个人总结
2015/03/03 职场文书
实习指导老师意见
2015/06/04 职场文书