跳到主要内容

数组扁平化与去重实现

面试题

编写一个程序,实现数组扁平化后的数组去重,最终得到一个升序且不重复的一维数组。

首先,对多维数组进行降维,然后去除重复元素,最后对数组进行排序。本实现采用递归方法进行降维,利用 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 提供了高效的去重机制,代码简洁。
  • 箭头函数优化排序:使用箭头函数使代码更简洁易读。

通过结合这几种方法,可以高效地实现数组的扁平化、去重和排序操作。