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实现计算代码行数的简单方法附代码
Aug 13 Javascript
javascript 异步页面查询实现代码(asp.net)
May 26 Javascript
ASP.NET jQuery 实例4(复制TextBox的文本到本地剪贴板上)
Jan 13 Javascript
js实现杯子倒水问题自动求解程序
Mar 25 Javascript
Javascript执行效率全面总结
Nov 04 Javascript
分享Javascript中最常用的55个经典小技巧
Nov 29 Javascript
jQuery.deferred对象使用详解
Mar 18 Javascript
深入理解js中this的用法
May 28 Javascript
js 模仿锚点定位的实现方法
Nov 19 Javascript
js CSS3实现卡牌旋转切换效果
Jul 04 Javascript
详解小程序input框失焦事件在提交事件前的处理
May 05 Javascript
在vue中使用image-webpack-loader实例
Nov 12 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
php上传文件中文文件名乱码的解决方法
2013/11/01 PHP
php自定义session示例分享
2014/04/22 PHP
php显示指定目录下子目录的方法
2015/03/20 PHP
WordPress中用于获取文章信息以及分类链接的函数用法
2015/12/18 PHP
php过滤输入操作之htmlentities与htmlspecialchars用法分析
2017/02/17 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
jQuery 使用个人心得
2009/02/26 Javascript
javascript 写类方式之八
2009/07/05 Javascript
jQuery实现html表格动态添加新行的方法
2015/05/28 Javascript
谈谈impress.js初步理解
2015/09/09 Javascript
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
Angularjs上传图片实例详解
2017/08/06 Javascript
javascript 面向对象实战思想分享
2017/09/07 Javascript
JS实现自定义状态栏动画文字效果示例
2017/10/12 Javascript
js获取form表单中name属性的值
2019/02/27 Javascript
微信小程序实现搜索功能并跳转搜索结果页面
2019/05/18 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
vue项目中使用particles实现粒子背景效果及遇到的坑(按钮没有点击响应)
2020/02/11 Javascript
python3+PyQt5+Qt Designer实现扩展对话框
2018/04/20 Python
Python socket模块方法实现详解
2019/11/05 Python
Opencv求取连通区域重心实例
2020/06/04 Python
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
物流司机岗位职责
2013/12/28 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
学校校庆演讲稿
2014/05/22 职场文书
开工典礼策划方案
2014/05/23 职场文书
学校欢迎标语
2014/06/18 职场文书
项目投资合作意向书
2014/07/29 职场文书
教师群众路线剖析材料
2014/09/29 职场文书
学校领导干部民主生活会整改方案
2014/09/29 职场文书
2015年护士节活动总结
2015/02/10 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
django中websocket的具体使用
2022/01/22 Python
Python中的datetime包与time包包和模块详情
2022/02/28 Python
Python使用永中文档转换服务
2022/05/06 Python