实现数组扁平化的6种方式

扁平化的实现

数组的扁平化其实就是将一个嵌套多层的数组 array(嵌套可以是任何层数)转换为只有一层的数组。

普通的递归实现

普通的递归思路很容易理解,就是通过循环递归的方式,一项一项地去遍历,如果每一项还是一个数组,那么就继续往下遍历,利用递归程序的方法,来实现数组的每一项的连接。我们来看下这个方法是如何实现的,如下所示。

var arr = [1, [2, [4, [5, [6]]]]]
function flatten(arr) {
   let result = []
   arr.forEach(item => {
   if (Array.isArray(item)) {
          result = result.concat(flatten(item))
      } else {
          result.push(item)
      }
   })
   return result
}
console.log(flatten(arr)) // [1,2,3,4,5,6]

利用reduce函数迭代

var arr = [1, [2, [4, [5, [6]]]]]
function flatten1(arr) {
   return arr.reduce((res, next) => {
      return res.concat(Array.isArray(next) ? flatten1(next) : next)
   }, [])
}
console.log(flatten1(arr))  // [1,2,3,4,5,6]

扩展运算符实现

var arr = [1, [2, [4, [5, [6]]]]]
var arr1 = [
	{
		name:'张三'
	},
	[
		{
			name:'李四'
		},
		{
			name:'王五'
		}
	]
]
function flatten2(arr) {
	while (arr.some(item => Array.isArray(item))) {
		arr = [].concat(...arr)
	}
	return arr
}
console.log(flatten2(arr))  // [1,2,3,4,5,6]
console.log(flatten(arr1))  // ['[object Object]', '[object Object]', '[object Object]']

split和toString共同处理

我们也可以通过split和toString两个方法,来共同实现数组扁平化,由于数组会默认带一个toString的方法,所以可以把数组直接转换成逗号分隔的字符串,然后再用split方法把字符串重新转换为数组,但是这种转换方式会有个问题,元素类型会被转换成字符串类型如下面的代码所示。

var arr = [1, [2, [4, [5, [6]]]]]
function flatten3(arr) {
	return arr.toString().split(',')
}
console.log(flatten3(arr))	// ['1','2','3','4','5','6']

ES6的flat函数实现

语法:arr.flat([depth])
其中depth是flat 的参数,depth是可以传递数组的展开深度(默认不填、数值是1),即展开一层数组。那么如果多层的该怎么处理呢?参数也可以传进 Infinity,代表不论多少层都要展开。那么我们来看下flat方注怎么实和洁看下面的代配

var arr = [1, [2, [4, [5, [6]]]]]
function flatten4(arr) {
	return arr.flat(Infinity)
}
console.log(flatten4(arr))	// [1,2,3,4,5,6]

JSON和正则表达式共同实现

我们在第四种方法中已经尝试了用toString方法,其中仍然采用了将JSON.stringify的方法先转换为字符串,然后通过正则表达式过滤掉字符串中的数组的方括号,最后再利用JSON.parse把它转换成数组。请看下面的代码。

var arr = [1, [2, [4, [5, [6]]]]]	
function flatten5(arr) {
	let str = JSON.stringify(arr)
	str = str.replace(/(\[|\])/g, '')
	str = '[' + str + ']'
	return JSON.parse(str)
}
console.log(flatten5(arr))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兢兢业业的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值