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 相关文章推荐
发现的以前不知道的函数
Sep 19 Javascript
jquery弹出关闭遮罩层实例
Aug 06 Javascript
百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
Feb 19 Javascript
实例详解jQuery的无new构建
Aug 02 Javascript
Vue2几种常见开局方式详解
Sep 09 Javascript
常用的9个JavaScript图表库详解
Dec 19 Javascript
Vue动态控制input的disabled属性的方法
Jun 26 Javascript
微信小程序实现顶部下拉菜单栏
Nov 04 Javascript
微信小程序常用赋值方法小结
Apr 30 Javascript
Vue拖拽组件列表实现动态页面配置功能
Jun 17 Javascript
使用vue打包进行云服务器上传的问题
Mar 02 Javascript
html中创建并调用vue组件的几种方法汇总
Nov 17 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的chr和ord函数实现字符加减乘除运算实现代码
2011/12/05 PHP
php curl登陆qq后获取用户信息时证书错误
2015/02/03 PHP
jquery获取input表单值的代码
2010/04/19 Javascript
JavaScript中获取未知对象属性的代码
2011/04/27 Javascript
Javascript 浮点运算的问题分析与解决方法
2013/08/27 Javascript
Javascript实现简单二级下拉菜单实例
2014/06/15 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
AngularJS入门教程之 XMLHttpRequest实例讲解
2016/07/27 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
jquery实现异步加载图片(懒加载图片一种方式)
2017/04/24 jQuery
Angular实现较为复杂的表格过滤,删除功能示例
2017/12/23 Javascript
解决vue-router进行build无法正常显示路由页面的问题
2018/03/06 Javascript
vue src动态加载请求获取图片的方法
2018/10/17 Javascript
微信小程序代码上传、审核发布小程序
2019/05/18 Javascript
p5.js临摹旋转爱心
2019/10/23 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
[50:05]VGJ.S vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中字典(dict)和列表(list)的排序方法实例
2014/06/16 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
python数据归一化及三种方法详解
2019/08/06 Python
python函数声明和调用定义及原理详解
2019/12/02 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
使用SimpleITK读取和保存NIfTI/DICOM文件实例
2020/07/01 Python
django使用channels实现通信的示例
2020/10/19 Python
Bose加拿大官方网站:美国知名音响品牌
2019/03/21 全球购物
雏鹰争章活动总结
2014/05/09 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
美术教师个人工作总结
2015/02/06 职场文书
2014年个人年终总结
2015/03/09 职场文书
工程技术负责人岗位职责
2015/04/13 职场文书
泰坦尼克号观后感
2015/06/04 职场文书
python迷宫问题深度优先遍历实例
2021/06/20 Python
Python matplotlib安装以及实现简单曲线的绘制
2022/04/26 Python