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 相关文章推荐
prototype1.4中文手册
Sep 22 Javascript
JavaScript基本概念初级讲解论坛贴的学习记录
Feb 22 Javascript
javascript实现复制与粘贴操作实例
Oct 16 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
Dec 18 Javascript
基于Css3和JQuery实现打字机效果
Aug 11 Javascript
jQuery.form插件的使用及跨域异步上传文件
Apr 27 Javascript
jQuery插件开发汇总
May 15 Javascript
浅谈window.onbeforeunload() 事件调用ajax
Jun 29 Javascript
RequireJS多页面应用实例分析
Jun 29 Javascript
浅谈super-vuex使用体验
Jun 25 Javascript
JavaScript ES 模块的使用
Nov 12 Javascript
抖音短视频(douyin)去水印工具的实现代码
Mar 30 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
Apache设置虚拟WEB
2006/10/09 PHP
php daodb插入、更新与删除数据
2009/03/19 PHP
编写PHP脚本过滤用户上传的图片
2015/07/03 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
YII2.0框架行为(Behavior)深入详解
2019/07/26 PHP
PHP7新特性
2021/03/09 PHP
浅谈JavaScript 覆盖原型以及更改原型
2016/08/31 Javascript
js实现鼠标跟随运动效果
2020/08/02 Javascript
微信小程序商品详情页规格属性选择示例代码
2017/10/30 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
layui表格checkbox选择全选样式及功能的实例
2018/03/07 Javascript
JS实现简易留言板(节点操作)
2020/03/16 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
Python测试人员需要掌握的知识
2018/02/08 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
Python实现基于C/S架构的聊天室功能详解
2018/07/07 Python
python字符串Intern机制详解
2019/07/01 Python
python做反被爬保护的方法
2019/07/01 Python
Python3+Appium安装使用教程
2019/07/05 Python
python检测服务器端口代码实例
2019/08/31 Python
opencv 查找连通区域 最大面积实例
2020/06/04 Python
Python如何实现自带HTTP文件传输服务
2020/07/08 Python
旅游个人求职信范文
2014/01/30 职场文书
房务中心文员岗位职责
2014/04/16 职场文书
保证书格式范文
2014/04/28 职场文书
需求分析说明书
2014/05/09 职场文书
团队队名口号大全
2014/06/06 职场文书
2014年度安全生产目标管理责任书
2014/07/25 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
四风查摆问题及整改措施
2014/10/10 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
毕业证明书
2015/06/19 职场文书
导游词之无锡古运河
2019/11/14 职场文书
使用python+pygame开发消消乐游戏附完整源码
2021/06/10 Python
Django+Celery实现定时任务的示例
2021/06/23 Python