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 相关文章推荐
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
Aug 14 Javascript
jquery ajax post提交数据乱码
Nov 05 Javascript
js实现iframe跨页面调用函数的方法
Dec 13 Javascript
Bootstrap进度条与AJAX后端数据传递结合使用实例详解
Apr 23 Javascript
JS中Swiper的使用和轮播图效果
Aug 11 Javascript
AngularJS中filter的使用实例详解
Aug 25 Javascript
Vue项目使用CDN优化首屏加载问题
Apr 01 Javascript
Node.js模块全局安装路径配置方法
May 17 Javascript
基于vue.js中关于下拉框的值默认及绑定问题
Aug 22 Javascript
layui table数据修改的回显方法
Sep 04 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
Vue router配置与使用分析讲解
Dec 24 Vue.js
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
CodeIgniter生成网站sitemap地图的方法
2013/11/13 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
2019/07/15 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
PHP7新增函数
2021/03/09 PHP
如何让动态插入的javascript脚本代码跑起来。
2007/01/09 Javascript
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
Extjs优化(二)Form表单提交通用实现
2013/04/15 Javascript
jquery选择器原理介绍($()使用方法)
2014/03/25 Javascript
node.js中的fs.lchmod方法使用说明
2014/12/16 Javascript
jquery form表单获取内容以及绑定数据
2016/02/24 Javascript
JavaScript常用判断写法大全(推荐)
2016/05/30 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
javascript代码优化的8点总结
2018/01/29 Javascript
swiper 解决动态加载数据滑动失效的问题
2018/02/26 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
基于iview的router常用控制方式
2019/05/30 Javascript
微信小程序如何调用图片接口API并居中显示
2019/06/29 Javascript
mui js控制开关状态、修改switch开关的值方法
2019/09/03 Javascript
如何通过vscode运行调试javascript代码
2020/07/24 Javascript
[57:53]Secret vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python生成随机数组的方法小结
2017/04/15 Python
Django如何开发简单的查询接口详解
2019/05/17 Python
关于numpy数组轴的使用详解
2019/12/05 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
DTD的含义以及作用
2014/01/26 面试题
四年大学生活的个人自我评价
2013/12/11 职场文书
秋季运动会表扬稿
2014/01/16 职场文书
经济贸易系求职信
2014/08/04 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
PyTorch梯度裁剪避免训练loss nan的操作
2021/05/24 Python
Java如何实现通过键盘输入一个数组
2022/02/15 Java/Android