数组的扁平化处理方法

在数组的操作中经常会遇到数组嵌套数组的情况,而我们常常需要的是单层数组。

也就是[1,2,[3,4,[5,[6,[7]]]]] ===》[ 1, 2, 3, 4, 5, 6, 7 ] ,我们称之为数组的扁平化处理。

方法一

如果是纯数字的数组(试了一下字符串的也可以)可以利用简单的toString和split方法

var arr = [1,‘a‘,[3,‘4‘,[‘b‘,[6,[7]]]]]
console.log(arr.toString().split(‘,‘))
//[ ‘1‘, ‘a‘, ‘3‘, ‘4‘, ‘b‘, ‘6‘, ‘7‘ ]

方法二

使用递归方法,如果元素还是数组则继续调用

var arr = [1,‘a‘,[3,‘4‘,[‘b‘,[6,[7]]]]];

function flatten(arr) {
  let res = [];
  for (let i=0,len=arr.length;i<len;i++) {
    if(Array.isArray(arr[i])) {
      res = res.concat(flatten(arr[i]));
    }else{
      res.push(arr[i])
    }
  }
  return res;
}
console.log(flatten(arr))
//[ 1, ‘a‘, 3, ‘4‘, ‘b‘, 6, 7 ]

上面代码可以通过array的reduce方法来实现简化

var arr = [[1,[2]],‘a‘,[3,‘4‘,[‘b‘,[6,[7]]]]]

function flatten(arr) {
  return arr.reduce((prev,item) => {
    return prev.concat(Array.isArray(item)?flatten(item):item);
  }, []);
}
console.log(flatten(arr))
//[ 1, 2, ‘a‘, 3, ‘4‘, ‘b‘, 6, 7 ]

reduce方法和reduceRight方法都会迭代数组所有项,然后构建一个最终返回值。第一个方法正向遍历,第二个反向遍历。

都接受两个参数,第一个是每一项要执行的函数,第二个是可选参数作为归并基础的初始值。函数接收4个参数:前一个值、当前值、项的索引、数组对象。

再化简

var arr = [[1,[2]],‘a‘,[3,‘4‘,[‘b‘,[6,[7]]]]];
const Flat6 = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? Flat6(b) : b), []);
console.log(Flat6(arr))
//[ 1, 2, ‘a‘, 3, ‘4‘, ‘b‘, 6, 7 ]

方法三

如果确定是简单的双层嵌套数组可以使用es6提供的扩展运算符

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

发现还有更好的方法了再添加吧~~~

原文地址:https://www.cnblogs.com/xguoz/p/8955380.html

时间: 2024-10-25 06:27:56

数组的扁平化处理方法的相关文章

FCC 中级算法题 数组扁平化

Steamroller 对嵌套的数组进行扁平化处理.你必须考虑到不同层级的嵌套. Array.isArray() 思路: (1)遍历arr,如果arr[i]是数组,就重新调用本函数继续循环,然后和新数组连接; (2)如果不是数组,就直接添加进新数组: 知识点: (1)Array.concat()方法用于合并两个或多个数组.此方法不会更改现有数组,而是返回一个新数组; (2)Array.push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度; (3)Array.isArray()用于

数组扁平化的几种处理放法

清明节,这几天放假闲来无事,好好研究一下基础知识,今天看看数组扁平化该怎么处理: 先来看数组扁平化是什么: var arr = [1,2,3,4,[5,6,[7,8]],true] => [1,2,3,4,5,6,7,8,true] 就是把二维或者多维数组,转成一维数组. 1.我想大部分同学会和一样,首先想到的肯定是遍历数组,如果某一项是基本数据类型,直接push到新数组,如果某一项是数组,则直接将这一项concat到新的数组上,当然如果是多维数组,还得用上递归的方法,继续往下层寻找,上代码:

数组扁平化的五种方法

数组扁平化概念 数组扁平化是指将一个多维数组变为一维数组 [1, [2, 3, [4, 5]]] ------> [1, 2, 3, 4, 5] 实现 1. reduce 参数 callback 执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数: accumulator累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方).currentValue数组中正在处理的元素.index 可选数组中正在处理的当前元

扁平化一个数组与对象

一.扁平化一个数组 前几天遇到的一个问题了,有一个数组var str=[1,2,1,[4,5,[6,7,[8,9]]]];如何讲这个数组扁平化,去掉这些重复的中括号.我I也是想了很久才写了出来,在这里分享给大家. 1 var str=[1,2,1,[4,5,[6,7,[8,9]]]]; 2 function arr(str,depth){ //depth代表扁平化的次数 3 var newArr=[]; //创建一个新数组,用来添加原数组元素和结构后的数组 4 str.forEach(item=

js 数组扁平化

// 扁平化简单的二维数组 const arr = [11, [22, 33], [44, 55], 66]; const flatArr = arr.join().split(','); // ["11", "22", "33", "44", "55", "66"] 主要使用的join方法: //如果数组中的元素是数组,会将里面的数组也调用join() let num = [[1,2]

深拷贝和数组扁平化

这两天做笔试题的时候遇到了深拷贝,在js中,一些基本类型是存在栈空间里的,而引用类型如object function之类的都是存在堆内存之中,只不过是他们的地址是在栈内存,通过地址找到对内存空间中的数据 上代码 function deepClone(obj){ var cloneobj = Array.isArray(obj)?[]:{}; //判断是数组还是对象 if(obj && typeof obj === "object"){ //判断当前的对象是否存在且类型是

数组扁平化

接受数组作为参数,数组元素为整数或者数组,数组元素包含整数或数组,函数返回扁平化后的数组 递归 var result=[]; var arr=[1, [2, [ [3, 4], 5], 6]]; function flat(arr,result){ for(var i=0;i<arr.length;i++){ if(typeof arr[i]==="number"){ result.push(arr[i]); } else{ flat(arr[i],result); } } }

javascript数组扁平化处理

最近看jQuery源码$.map方法的实现,返回值利用了一个扁平化处理 return ret.concat.apply( [], ret ) 这有个疑问,不知道为什么不直接返回ret 根据这个返回值处理,推测ret可能不是一阶数组,例如[1,2,[3,4]]这样的; var ret = [1,2,[3,4]] 所以进行了这样的处理

js数组拍平(数组扁平化)的五种方式

1.数组拍平也称数组扁平化,就是将数组里面的数组打开,最后合并为一个数组 2.实现 var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; a:递归实现 function fn(arr){ let arr1 = [] arr.forEach((val)=>{ if(val instanceof Array){ arr1 = arr1.concat(fn(val)) }else{ arr1.push(val) } }) return arr1 } b:reduc