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 相关文章推荐
随窗体滑动的小插件sticky源码
Jun 21 Javascript
js判断运行jsp页面的浏览器类型以及版本示例
Oct 30 Javascript
Javascript学习笔记之 函数篇(一) : 函数声明和函数表达式
Jun 24 Javascript
JavaScript编程中window的location与history对象详解
Oct 26 Javascript
jQuery实现图片向左向右切换效果的简单实例
May 18 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
Vue实现选择城市功能
May 27 Javascript
页面间固定参数,通过cookie传值的实现方法
May 31 Javascript
JQuery.dataTables表格插件添加跳转到指定页
Jun 09 jQuery
ES6知识点整理之模块化的应用详解
Apr 15 Javascript
从0到1搭建element后台框架优化篇(打包优化)
May 12 Javascript
vue打包npm run build时候界面报错的解决
Aug 13 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
php使用SAE原生Mail类实现各种类型邮件发送的方法
2016/10/10 PHP
js实现的日期操作类DateTime函数代码
2010/03/16 Javascript
javascript 快速排序函数代码
2012/05/30 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
AngularJS通过$sce输出html的方法
2016/09/22 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
jQuery实现的页面遮罩层功能示例【测试可用】
2017/10/14 jQuery
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
Vue实现内部组件轮播切换效果的示例代码
2018/04/07 Javascript
微信小程序自定义tab实现多层tab嵌套功能
2018/06/15 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
详解vue为什么要求组件模板只能有一个根元素
2019/07/22 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
vue深度监听(监听对象和数组的改变)与立即执行监听实例
2020/09/04 Javascript
Vue ​v-model相关知识总结
2021/01/28 Vue.js
原生微信小程序开发中 redux 的使用详解
2021/02/18 Javascript
[51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
2018/08/25 DOTA
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
ubuntu17.4下为python和python3装上pip的方法
2018/06/12 Python
Window环境下Scrapy开发环境搭建
2018/11/18 Python
django框架使用orm实现批量更新数据的方法
2019/06/21 Python
python写日志文件操作类与应用示例
2019/07/01 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
PyTorch中permute的用法详解
2019/12/30 Python
Python如何实现大型数组运算(使用NumPy)
2020/07/24 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
六年级语文下册教学计划
2015/01/22 职场文书
2015年音乐教学工作总结
2015/07/22 职场文书
2016春节放假通知范文
2015/08/18 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
vue使用v-model进行跨组件绑定的基本实现方法
2021/04/28 Vue.js