手写数组flatern数组拍平,考虑多层级

本文详细介绍了JavaScript中使用concat()方法进行数组拍平的基本原理与限制,并提供了一种递归处理深层嵌套数组的解决方案。

知识先填坑:

concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组, 而仅仅会返回被连接数组的一个副本返回一个新的数组。
该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。 如果要进行 concat() 操作的参数是数组, 那么添加的是数组中的元素, 而不是数组。

如:

const res= [].concat(1, 2, [3, 4], 5)
console.log(res) //[1, 2, 3, 4, 5] 只有一层数组,完成数组拍平
const res2 = [].concat(1, 2, [3, [4]], 5)
console.log(res2) //[1, 2, 3, [4], 5] 超过一层数组,只能拍平一层数组

结论:concat()方法可以拍平数组,但只能拍平一层数组

利用concat进行递归处理数组拍平:

思路:
验证有没有深层数组,没有则返回,如果有进行拍平,继续递归处理

代码如下:

	function flat(arr) {
	// 验证 arr中,还有没有深层数组
	var isDeep = arr.some(item => item instanceof Array)
	if (!isDeep) {
	    //如果不是深层数组
	    return arr 
	}
	//是深层数组,拍平数组后,递归继续判断处理
	const res = Array.prototype.concat.apply([], arr)
	return flat(res)

}
const res = flat([1, 2, [3, [4, 6], 7], 5])
console.log(res) //[1, 2, 3, 4, 6, 7, 5]
### 实现数组扁平化的多种方法 数组扁平化是指将一个嵌套数组转换为一个没有嵌套的新数组的过程。在 JavaScript 中,可以通过多种方式手写实现数组的扁平化功能。 #### 使用递归实现数组扁平化 递归是一种常见的方法,用于处理嵌套结构。以下是一个使用递归实现数组扁平化的示例: ```javascript function flattenArray(arr) { let result = []; arr.forEach(item => { if (Array.isArray(item)) { result = result.concat(flattenArray(item)); } else { result.push(item); } }); return result; } // 实例用法 let nestedArray = [1, [2, [3, [4, [5]]]], 6]; let flattenedArray = flattenArray(nestedArray); console.log(flattenedArray); // 输出:[1, 2, 3, 4, 5, 6] ``` #### 使用 `flatMap` 方法实现数组扁平化 `flatMap` 方法结合了 `map` 和 `flat` 的功能,可以在一次操作中完成映射和扁平化。此方法需要 ECMAScript 2019 的支持: ```javascript function flattenArray(arr) { return arr.flatMap(item => Array.isArray(item) ? flattenArray(item) : item); } // 实例用法 let nestedArray = [1, [2, [3, [4, [5]]]], 6]; let flattenedArray = flattenArray(nestedArray); console.log(flattenedArray); // 输出:[1, 2, 3, 4, 5, 6] ``` #### 使用 `some` 和 `apply` 方法实现数组扁平化 这种方法通过 `some` 方法检查数组是否包含嵌套数组,然后使用 `apply` 和 `concat` 进行扁平化操作: ```javascript function flat(arr) { const isDeep = arr.some(item => item instanceof Array); if (!isDeep) { return arr; } else { const res = Array.prototype.concat.apply([], arr); return flat(res); } } // 实例用法 const res = flat([1, 2, [3, 4, 5, [6, 7]]]); console.log(res); // 输出:[1, 2, 3, 4, 5, 6, 7] ``` #### 使用 `for...of` 循环实现数组扁平化 这种方法通过 `for...of` 循环遍历数组,并递归处理嵌套数组: ```javascript function flatten(arr) { let ans = []; for (let item of arr) { if (Array.isArray(item)) { ans = ans.concat(flatten(item)); } else { ans = ans.concat(item); } } return ans; } // 实例用法 console.log(flatten([[1, 2, [3, 4]], 5])); // 输出:[1, 2, 3, 4, 5] ``` #### 使用自定义 `myFlat` 方法实现数组扁平化 这种方法模拟了内置的 `flat` 方法,允许指定展开的深度: ```javascript Array.prototype.myFlat = function (depth = 1) { var cur_dep = 1; let len = this.length; var unpack = function (arr) { let len = arr.length; let res = []; if (cur_dep <= depth) { for (let i = 0; i < len; i++) { if (Array.isArray(arr[i])) { cur_dep += 1; res.push(...unpack(arr[i])); cur_dep -= 1; } else { res.push(arr[i]); } } } else { res.push(...arr); } return res; }; return unpack(this); }; // 实例用法 var arr = new Array(0, 1, 2, [[[3, 4]]]); console.log(arr.myFlat(2)); // 输出:[0, 1, 2, [3, 4]] ``` ### 使用内置 `flat` 方法实现数组扁平化 从 ES10 开始,JavaScript 引入了 `flat` 方法,可以直接用来扁平化数组。`flat` 方法还可以接受一个可选的参数,表示要展开的嵌套层数: ```javascript let nestedArray = [1, [2, [3, [4]], 5]; console.log(nestedArray.flat(Infinity)); // 输出 [1, 2, 3, 4, 5] ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值