用 reduce 配合 set 可实现多维数组展开并去重:先递归扁平化再用 set 去重,核心是 reduce 累积处理每一层,支持任意嵌套深度;二维可用 reduce + concat 简化;健壮版需过滤 null/undefined;相比 flat,reduce 更兼容且逻辑清晰。

用 reduce 配合 Set 对多维数组展开并去重,核心思路是:先递归或迭代扁平化,再用 Set 去重,而 reduce 用来累积处理每一层。关键在于扁平化逻辑要内嵌在 reduce 的回调中。
用 reduce + Array.isArray 递归展开 + Set 去重
适合任意嵌套深度,简洁可控:
const deepUnique = arr =>
Array.from(
arr.reduce((acc, item) => {
if (Array.isArray(item)) {
item.forEach(sub => acc.push(...deepUnique([sub]))); // 递归处理子数组
} else {
acc.push(item);
}
return acc;
}, [])
);
// 使用示例
const nested = [1, [2, 3], [4, [5, 6, [7, 8]]], 3, 5];
const result = [...new Set(deepUnique(nested))]; // [1, 2, 3, 4, 5, 6, 7, 8]
一行式 reduce 扁平化(仅限一层嵌套)+ Set 去重
如果确定最多二维(如 [[1,2], [3,4], 5]),可直接用 concat 或展开运算符:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 注意:不能直接对三维及以上用此法,否则会把内层数组当元素保留
- 写法更轻量:
[].concat(...arr)或arr.flat(1)更推荐,但若坚持用reduce:
const flatUnique2D = arr =>
[...new Set(
arr.reduce((acc, val) => acc.concat(Array.isArray(val) ? val : [val]), [])
)];
兼容 null/undefined 和基础类型去重的健壮写法
避免 Set 对 NaN、Object 等误判,且跳过空值:
- 用
Set天然支持NaN去重(这是它比filter + indexOf的优势) - 对对象去重需额外序列化,此处默认只处理原始值
- 过滤掉
null、undefined再进Set:
const safeDeepUnique = arr => {
const flatten = (list) =>
list.reduce((acc, item) => {
if (Array.isArray(item)) acc.push(...flatten(item));
else if (item != null) acc.push(item); // 排除 null/undefined
return acc;
}, []);
return [...new Set(flatten(arr))];
};
为什么不用 arr.flat().reduce(...)?
arr.flat(Infinity) 虽能一键展平,但不是所有环境支持(尤其旧版 Node.js),且 flat 本身不负责去重;而 reduce + Set 组合把“展开”和“去重”两个意图都显式表达出来,逻辑更透明,也便于调试或加中间处理(比如类型转换、过滤)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










