javascript多维数组深度去重需先明确“重复”定义(深/浅相等),再选择json序列化扁平去重(简单高效,适用于纯数据)或递归深比较保留结构去重(健壮但复杂)。

JavaScript 中对多维数组进行深度递归去重,核心在于:**把嵌套结构扁平化(或保持结构)的同时,对每个元素做唯一性判断;而“深度”意味着要递归处理对象、数组等可嵌套类型,“去重”则需定义“相等”的标准(如浅比较、深比较、JSON 字符串化等)。**
一、明确“重复”的定义:深相等 vs 浅相等
多维数组里可能包含数字、字符串、对象、嵌套数组等。直接用 Set 或 includes() 无法正确识别两个内容相同但引用不同的对象或数组是否“重复”。
常见策略:
- JSON 字符串化判重:简单快捷,适用于纯数据(无函数、undefined、Symbol、循环引用)的数组
- 递归深比较判重:更健壮,支持任意值类型(含 null、NaN、对象、嵌套数组),但需自己实现或借助工具函数
- 只对基础类型 + 数组做去重,对象跳过或按引用处理:折中方案,避免过度复杂
二、方案一:JSON 序列化 + 递归扁平 + Set 去重(推荐入门)
适合大多数纯数据场景(如 API 返回的嵌套配置、表格数据等):
function deepUnique(arr) {
if (!Array.isArray(arr)) return arr;
// 深度扁平化(不限层级)
const flatten = (input) => {
return input.reduce((acc, item) => {
if (Array.isArray(item)) {
acc.push(...flatten(item));
} else {
acc.push(item);
}
return acc;
}, []);
};
// 转为 JSON 字符串用于去重(注意:顺序敏感,{a:1,b:2} ≠ {b:2,a:1})
const seen = new Set();
const result = [];
for (const item of flatten(arr)) {
const key = JSON.stringify(item);
if (!seen.has(key)) {
seen.add(key);
result.push(item);
}
}
return result;
}
// 示例
const arr = [1, [2, 3], [2, 3], [4, [5, 6]], [4, [5, 6]], {x: 1}, {x: 1}];
console.log(deepUnique(arr));
// → [1, 2, 3, 4, [5, 6], {"x":1}]
三、方案二:保留嵌套结构的深度去重(不扁平)
若需维持原数组层级结构(如去重子数组自身,而非拆开),可用递归 + 深比较:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
<pre class="brush:php;toolbar:false;">function deepEqual(a, b) {
if (a === b) return true;
if (a == null || b == null) return false;
if (typeof a !== 'object' || typeof b !== 'object') return a === b;
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
for (let key of keysA) {
if (!keysB.includes(key)) return false;
if (!deepEqual(a[key], b[key])) return false;
}
return true;
}
function deepUniqueNested(arr) {
if (!Array.isArray(arr)) return arr;
const result = [];
const seen = [];
for (const item of arr) {
// 对每个元素:如果是数组,先递归去重;再判断是否已存在(深比较)
const processed = Array.isArray(item) ? deepUniqueNested(item) : item;
const isDuplicate = seen.some(existing => deepEqual(existing, processed));
if (!isDuplicate) {
seen.push(processed);
result.push(processed);
}
}
return result;
}
<h3>四、实用建议与注意事项</h3>
<p><strong>✅ 推荐优先尝试 JSON 方案</strong>:90% 的业务多维数组是纯数据,速度快、代码短、易维护。</p>
<p><strong>⚠️ 注意 JSON 局限性</strong>:会忽略 <code>undefined</code></p>、function、Symbol;NaN 变成 null;对象键序不同视为不同;无法处理循环引用。
? 处理循环引用? 可在深比较或序列化时加 seen 缓存(WeakMap 记录已遍历对象引用)。
? 工具库参考:Lodash 的 _.uniqWith(arr, _.isEqual) + 自定义递归处理,或 fast-deep-equal 替代手写深比较。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










