数组扁平化是指将一个多维数组转化为一维数组的过程。这一操作在处理嵌套数据结构时尤为常见。你会哪些方法来将数组扁平化呢?以下是几种实现数组扁平化的方法,看看有没有你想要的吧。
方法一:递归实现
代码示例:
const arr = [1, [2, [3, 4]]];
function flatten(arr) {
let result = [];
for (let i = 0, len = arr.length; i < len; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]));
} else {
result.push(arr[i]);
}
}
return result;
}
console.log(flatten(arr));
思路与涉及知识:
- 递归:这是一种通过函数自我调用来解决问题的方法。在这个例子中,函数
flatten会检查数组中的每个元素,如果元素是数组,则递归调用自身处理子数组,直到所有层级都被展平。 - concat():此方法用于连接两个或多个数组,返回一个新的数组,不改变原数组。在这里用于合并结果数组和递归展平后的子数组。
方法二:字符串分割与转换
代码示例:
var arr = [1, [2, [3, 4, [5, [6]]]]];
function flatten(arr) {
var strArr = arr.toString(); // 转换为逗号分隔的字符串
var numArr = strArr.split(","); // 分割字符串为数组
var result = [];
for (var i = 0, len = numArr.length; i < len; i++) {
result.push(+numArr[i]); // 字符串转数字并推入结果数组
}
return result;
}
console.log(flatten(arr));
思路与涉及知识:
- toString() :将数组转换为字符串形式,数组元素之间默认使用逗号分隔。
- split(',') :以逗号为分隔符,将字符串分割成多个子字符串组成的数组。
- 类型转换:使用加号
+前缀将字符串转换为数字,这是JavaScript中的一种简便类型转换方式,+有很多作用:一是可以拼接字符串,二是数值计算,三是类型转换 (隐式类型转换)。当然也可以用parseInt(),Number ()来进行类型转换转为数字。
方法三:使用map与字符串转换结合
代码示例:
var arr = [1, [2, [3, 4, [5, [6]]]]];
function flatten(arr) {
return arr.toString().split(',').map(function(item) {
return +item;
});
}
console.log(flatten(arr));
思路与涉及知识:
- 该方法在方法二的基础上进一步简化,利用了
Array.prototype.map()方法直接对分割后的字符串数组进行遍历,并在映射过程中将每个字符串元素转换为数字。 - map() :对数组中的每个元素执行一个提供的函数,并返回一个新的数组,包含每次函数调用的结果。
方法四:ES6展开运算符
代码示例:
const arr = [1, [2, [3, 4]]];
function flatten(arr) {
return arr.reduce((acc, val) =>
Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), []);
}
console.log(flatten(arr));
或更简洁地使用递归与展开运算符:
function flatten(arr) {
return arr.flat(Infinity);
}
console.log(flatten(arr));
思路与涉及知识:
- reduce() :数组方法,对累加器和当前值执行一个函数(从左到右),将其结果累积到累加器中,最后返回累加器的值。
- 展开运算符(...) :允许一个表达式的元素被展开到另一个位置,常用于合并数组或作为函数参数传递数组。
- flat():创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。其中
Infinity作为参数表示无论嵌套多深,都会完全展平数组。
flat(Infinity),该方法是在MDN中查阅到的,有兴趣的,可以去看看哦 developer.mozilla.org/zh-CN/docs/…
总结
实现方法多样,主要包括递归、迭代结合类型检查、字符串操作、ES6的展开运算符及Array.prototype.flat()方法等。递归是最直观的方式,通过检查并递归处理子数组达到扁平化效果,但需注意栈溢出风险。迭代通常效率较高,通过循环遍历并利用条件判断合并数组。ES6引入的展开运算符...提供了简洁的数组合并方式,可直接在构造新数组时展开嵌套数组。而flat()方法更为直接,支持指定深度展平,如arr.flat(Infinity)彻底展平任意深度的嵌套数组。选择合适的方法需考虑兼容性、性能及代码可读性。