数组扁平化与去重实现
面试题
编写一个程序,实现数组扁平化后的数组去重,最终得到一个升序且不重复的一维数组。
首先,对多维数组进行降维,然后去除重复元素,最后对数组进行排序。本实现采用递归方法进行降维,利用 Set
对象去重,并通过 sort
方法进行排序。
const arr = [[1, 2, 3], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
const uniqueSortedArr = Array.from(new Set(flatten(arr))).sort((a, b) => a - b);
console.log(uniqueSortedArr);
function flatten(array) {
const flattenedArray = [];
array.forEach((element) => {
if (Array.isArray(element)) {
flattenedArray.push(...flatten(element));
} else {
flattenedArray.push(element);
}
});
return flattenedArray;
}
上述代码的执行结果为:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
代码解析
数组扁平化、去重和排序的过程可以分为以下几个步骤:
1. 数组扁平化
使用递归函数 flatten
对多维数组进行降维。该函数遍历数组中的每个元素,如果元素是数组,则递归调用自身并使用扩展运算符 ...
将结果合并到 flattenedArray
中;否则,直接将元素添加到 flattenedArray
。
function flatten(array) {
const flattenedArray = [];
array.forEach((element) => {
if (Array.isArray(element)) {
flattenedArray.push(...flatten(element));
} else {
flattenedArray.push(element);
}
});
return flattenedArray;
}
2. 数组去重
利用 Set
对象的唯一性特性,将扁平化后的数组转换为 Set
,然后使用 Array.from
方法将其转换回数组形式,从而实现去重。
const uniqueSortedArr = Array.from(new Set(flatten(arr)));
3. 数组排序
使用 sort
方法对去重后的数组进行升序排序。排序函数 (a, b) => a - b
确保数值按照从小到大的顺序排列。
const uniqueSortedArr = Array.from(new Set(flatten(arr))).sort((a, b) => a - b);
实战示例
假设有一个包含多层嵌套的数组:
const arr = [[1, 2, 3], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10];
通过上述方法处理后,得到的 uniqueSortedArr
为:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
最佳实践
- 使用递归进行数组扁平化:递归方法简洁直观,适用于多层嵌套的数组结构。
- 利用
Set
进行去重:Set
提供了高效的去重机制,代码简洁。 - 箭头函数优化排序:使用箭头函数使代码更简洁易读。
通过结合这几种方法,可以高效地实现数组的扁平化、去重和排序操作。