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 相关文章推荐
js鼠标左右键 键盘值小结
Jun 11 Javascript
基于jquery的鼠标拖动效果代码
May 30 Javascript
『jQuery』名称冲突使用noConflict方法解决
Apr 22 Javascript
JavaScript中的Math.sin()方法使用详解
Jun 15 Javascript
vue组件如何被其他项目引用
Apr 13 Javascript
React复制到剪贴板的示例代码
Aug 22 Javascript
JavaScript使用atan2来绘制箭头和曲线的实例
Sep 14 Javascript
input type=file 选择图片并且实现预览效果的实例
Oct 26 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 Javascript
Vue双向数据绑定(MVVM)的原理
Oct 03 Javascript
微信小程序实现简单的select下拉框
Nov 23 Javascript
Moment的feature导致线上bug解决分析
Sep 23 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
Laravel 5.5 的自定义验证对象/类示例代码详解
2017/08/29 PHP
JavaScript高级程序设计 阅读笔记(四) ECMAScript中的类型转换
2012/02/27 Javascript
Javascript无阻塞加载具体方式
2013/06/28 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
js获取checkbox值的方法
2015/01/28 Javascript
javascript编写实用的省市选择器
2015/02/12 Javascript
iScroll中事件点击触发两次解决方案
2015/03/11 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
详细分析使用AngularJS编程中提交表单的方式
2015/06/19 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
angularjs 中$apply,$digest,$watch详解
2016/10/13 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
angularjs定时任务的设置与清除示例
2017/06/02 Javascript
详解刷新页面vuex数据不消失和不跳转页面的解决
2018/01/30 Javascript
使用veloticy-ui生成文字动画效果
2018/02/08 Javascript
通过webpack引入第三方库的方法
2018/07/20 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
Js视频播放器插件Video.js使用方法详解
2020/02/04 Javascript
利用Python实现命令行版的火车票查看器
2016/08/05 Python
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
对python字典过滤条件的实例详解
2019/01/22 Python
pytorch masked_fill报错的解决
2020/02/18 Python
python字符串判断密码强弱
2020/03/18 Python
Python3实现建造者模式的示例代码
2020/06/28 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
2021/01/05 Python
anaconda升级sklearn版本的实现方法
2021/02/22 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
山海经纬软件测试笔试题和面试题
2013/04/02 面试题
社区十八大感言
2014/01/19 职场文书
员工评语范文
2014/12/31 职场文书
实习工作表现评语
2014/12/31 职场文书
健康证明
2015/06/19 职场文书
Elasticsearch 配置详解
2022/04/19 Java/Android
Golang jwt身份认证
2022/04/20 Golang