js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解


Posted in Javascript onJanuary 19, 2019

数组的扁平化:将多维数组变成一维数组

对于一个像这样的嵌套数组:a=[1,[2,[3,4]],5,6]我们想要把它变成一个一维数组,有下面几种方法:

方法一:递归一

function parseArr(arr,res){
  var i=0;
  for(i=0;i<arr.length;i++){
    if(arr[i] instanceof Array){
      parseArr(arr[i],res);
    }else{
      res.push(arr[i]);
    }
  }
}
var a=[1,[2,[3,4]],5,6];
var res=[];
parseArr(a,res);

递归二(推荐)

var arr = ['mu','zi',['dig',['big','love']]]
  function flatten(arr){ 
    var res = []; 
    for(var i=0;i<arr.length;i++){
      if(Array.isArray(arr[i])){
        res = res.concat(flatten(arr[i]));
      }else{
        res.push(arr[i]);
      } 
    } 
    return res; 
  }
  console.log(flatten(arr))//["mu", "zi", "dig", "big", "love"]

对上面的方法进行解析:

1.语法: Array.isArray(object);参数:object必需。要测试的对象。

返回值

如果 object 是数组,则为 true;否则为 false。 如果 object 参数不是对象,则返回 false。

2.push()与concat()的区别

  • 1,push()是在原数组的基础上修改的,执行push()方法后原数组的值也会变,在原数组后面添加值;若操作concat()的是一个数组先把原数组的每个值复制到一个新/另的数组,然后在新/另数组上进行操作,所以不会改变原数组的值。
  • 2,如果参数不是数组,不管参数个数有多少个,push()和concat()都会直接把参数添加到数组后;如果参数是一个数组,push()就会直接把数组添加到原数组后,而concat()会把数组里的值取出来添加到原数组后。

方法二: 使用toString先变成一个字符串再使用split变成一个字符串数组(数组中的每个元素是一个字符串),最后使用map方法将数组中的每个元素返回为非字符串。

//arr数组中的元素不能为字符串只能为数组
var newArr=arr.toString().split(',').map(function(ele){
  return +ele;
});
console.log(newArr)
alert(typeof arr[0]); //number

方式三:使用toString()和split(',')方法

  toString()

     如果数组的元素都是数字,那么我们可以考虑使用 toString 方法,因为:
     toString会将数组中的数以逗号形式结合起来。

toString()之后再split(',')转成数组,并将其转换回数字数组:

var arr = [1, [2, [3, 4],[5,[6],[7,8]]]];
  var arrStr = arr.toString();
  console.log(arrStr);//1,2,3,4,5,6,7,8
  var strArr = arrStr.split(',');
  console.log(strArr)//["1", "2", "3", "4", "5", "6", "7", "8"]

方式二和方式三  的场景只适用于数组内全部是数字的情况,因为中间是全部转换为字符串了。

方法四: 使用reduce和concat方法

Array.prototype.flatten=function(){
  return this.reduce(function(prev, cur) {
    var moreArr = [].concat(cur).some(Array.isArray); //判断cur是不是一个数组
    return prev.concat(moreArr ? cur.flatten() : cur);
  },[]);
};
var arr=a.flatten();
//合并二维数组
  var twoArr = [['mu','zi'],['dig','big'],['lucky','jiji']];
  var oneArr = twoArr.reduce(function(total,currentValue){
    // console.log(total)
    return total.concat(currentValue);
  })
  console.log(oneArr);//["mu", "zi", "dig", "big", "lucky", "jiji"]

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce() 可以作为一个高阶函数,用于函数的 compose。

注意: reduce() 对于空数组是不会执行回调函数的。

js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解

var arr = [1,2,3,4,5,6,7,8,9,10]
  var str = arr.reduce(function(prev,cur,index,arr){
    return prev + cur ;
  })
  console.log(str)//55

方式五:es6扩展运算符

function flatten(arr){
  while(arr.some(item=>Array.isArray(item)){
    arr = [].concat(...arr);
  }
  return arr;
}

由于扩展运算符一次只能展开一层数组:

var arr = [1, [2, [3, 4]]];
console.log([].concat(...arr)); // [1, 2, [3, 4]]

因此考虑只要数组中还有数组,就使用扩展运算符展开一次。

若有不足请多多指教!希望给您带来帮助!

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。如果你想了解更多相关内容请查看下面相关链接

Javascript 相关文章推荐
12款经典的白富美型—jquery图片轮播插件—前端开发必备
Jan 08 Javascript
jquery插件之信息弹出框showInfoDialog(成功/错误/警告/通知/背景遮罩)
Jan 09 Javascript
JavaScript动态创建div属性和样式示例代码
Oct 09 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
原生JS实现LOADING效果
Mar 16 Javascript
图解js图片轮播效果
Dec 20 Javascript
Bootstrap的class样式小结
Dec 01 Javascript
Mongoose经常返回e11000 error的原因分析
Mar 29 Javascript
js canvas实现二维码和图片合成的海报
Nov 19 Javascript
在vue中实现嵌套页面(iframe)
Jul 30 Javascript
ant design中upload组件上传大文件,显示进度条进度的实例
Oct 29 Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 Javascript
js的各种数据类型判断的介绍
Jan 19 #Javascript
JavaScript实现与使用发布/订阅模式详解
Jan 19 #Javascript
Vuex中的State使用介绍
Jan 19 #Javascript
为什么要使用Vuex的介绍
Jan 19 #Javascript
Vue核心概念Getter的使用方法
Jan 18 #Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 #Javascript
JavaScript数据结构之栈实例用法
Jan 18 #Javascript
You might like
Ajax+PHP边学边练 之五 图片处理
2009/12/03 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
浅析php中抽象类和接口的概念以及区别
2013/06/27 PHP
PHP上传图片类显示缩略图功能
2016/06/30 PHP
简单的自定义php模板引擎
2016/08/26 PHP
PHP用户验证和标签推荐的简单使用
2016/10/31 PHP
实例讲解YII2中多表关联的使用方法
2017/07/21 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
比较简单的异步加载JS文件的代码
2009/07/18 Javascript
jquery使用ColorBox弹出图片组浏览层实例演示
2013/03/14 Javascript
js 调用父窗口的具体实现代码
2013/07/15 Javascript
使用JS取得焦点(focus)元素代码
2014/03/22 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
javascript自动生成包含数字与字符的随机字符串
2015/02/09 Javascript
jQuery.Highcharts.js绘制柱状图饼状图曲线图
2015/03/14 Javascript
javascript制作sql转换为stringBuffer的小工具
2015/04/03 Javascript
BootStrap制作导航条实例代码
2016/05/06 Javascript
Vue组件BootPage实现简单的分页功能
2016/09/12 Javascript
微信小程序框架的页面布局代码
2019/08/17 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
Python迭代用法实例教程
2014/09/08 Python
python 判断参数为Nonetype类型或空的实例
2018/10/30 Python
python3实现表白神器
2019/04/09 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
python matlab库简单用法讲解
2020/12/31 Python
CSS3制作苹果风格键盘特效
2015/02/26 HTML / CSS
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
世界领先的豪华床上用品供应商之一:Bedeck Home
2019/03/18 全球购物
高中生校园生活自我评价
2013/09/19 职场文书
幼儿园母亲节活动方案
2014/03/10 职场文书
国际贸易实务实训报告
2014/11/05 职场文书
清明节寄语2015
2015/03/23 职场文书
大学生学生会工作总结2015
2015/05/26 职场文书
Windows Server 2012配置DNS服务器的方法
2022/04/29 Servers