返回

用JS优雅处理扁平化和去重:一道面试题引发的思考

前端

在一次面试中,一道看似简单的题目引发了深入的思考,它考察了 JavaScript 开发者处理扁平化、排序和去重操作的能力。

本题要求使用尽可能少的代码,最好在五行以内,优雅地处理这三个操作。这道题不仅考验了算法基础,还要求运用函数式编程的技巧,以实现简洁高效的解决方案。

扁平化、排序、去重

扁平化是指将多维数组转化为一维数组。排序是指将数组中的元素按照特定规则进行排列。去重是指移除数组中的重复元素。

扁平化:

使用 flat 方法,可直接将多维数组扁平化为一维数组:

const flattened = arr.flat();

排序:

使用 sort 方法,可将数组按照元素的 Unicode 代码点进行排序:

const sorted = arr.sort();

去重:

使用 Set 对象,可轻松移除重复元素:

const unique = [...new Set(arr)];

优雅的解决方案

将这三个操作结合起来,我们可以使用函数式编程的 mapreducefilter 方法:

const processed = arr
  .map(item => Array.isArray(item) ? item.flat() : item) // 扁平化
  .reduce((acc, item) => acc.concat(item), []) // 合并
  .sort() // 排序
  .filter((item, i, arr) => arr.indexOf(item) === i); // 去重

代码说明

首先,我们使用 map 方法对数组的每个元素进行扁平化处理。如果是嵌套数组,则将其扁平化,否则直接返回元素。

然后,使用 reduce 方法将处理后的数组合并成一个一维数组。

接着,使用 sort 方法对合并后的数组进行排序。

最后,使用 filter 方法对排序后的数组进行去重,仅保留不重复的元素。

总结

这个简洁优雅的解决方案展示了 JavaScript 在处理复杂数据结构方面的强大功能。它不仅满足了面试题的要求,还突出了函数式编程在现代 Web 开发中的优势。通过理解扁平化、排序和去重操作的基本原理,以及如何利用 JavaScript 的函数式特性,我们可以编写出高效可维护的代码。