扁平化的实现

数组的扁平化其实就是将一个嵌套多层的数组 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))
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐