
本文介绍一种简洁高效的 javascript 方法,利用对象键的唯一性,对嵌套二维数组按「客户名」和「产品码」组合去重,确保每个客户-产品组合仅保留首次出现的记录,同时天然兼容无重复客户名的情况。
本文介绍一种简洁高效的 javascript 方法,利用对象键的唯一性,对嵌套二维数组按「客户名」和「产品码」组合去重,确保每个客户-产品组合仅保留首次出现的记录,同时天然兼容无重复客户名的情况。
在处理如客户订单、报表导出等业务场景时,常需对嵌套数组(如 [[id, clientName, productCode], ...])执行语义化去重:不仅要避免同一客户被多次统计,还需区分其不同产品线。题目中提出的两个条件——
- 单客户无重复 → 全部保留;
-
单客户有多个记录 → 但仅保留每个「客户名 + 产品码」组合的首次出现项——
本质上等价于:以 [clientName, productCode] 为联合键,取每组键对应的第一条数据。
这一需求无需嵌套循环或复杂状态管理。核心思路是:将二维数组映射为以 name-product 为键的对象字典,利用对象属性的自动去重特性,配合逻辑赋值运算符 ||= 保证首次赋值生效,后续同键项被忽略。
以下是清晰、可复用的实现代码:
let testArray = [
["ASDF245", "Jeff Hill", "BOP"],
["ASCG285", "Jerry F Tate", "BOP"],
["ASDF240", "Jeff Hill", "WC"],
["ASDF291", "Jake Sab", "BOP"],
["ASDF301", "Mary Stein", "WC"],
["ASDF460", "Jeff Hill", "WC"],
["ASDF245", "Hello Dup", "BOP"],
["ASDF245", "Hello Dup", "BOP"],
["ASDF245", "Hello Dup", "WC"]
];
// 步骤1:构建以 "客户名-产品码" 为键的映射字典
const uniqueMap = {};
testArray.forEach(([id, name, product]) => {
const key = `${name}-${product}`;
// ||= 确保仅第一次遇到该 key 时才赋值,天然满足“保留首条”要求
uniqueMap[key] ||= [id, name, product];
});
// 步骤2:提取所有唯一记录(顺序与原数组首次出现顺序一致)
const result = Object.values(uniqueMap);
console.log(result);
// 输出:
// [
// ["ASDF245", "Jeff Hill", "BOP"],
// ["ASCG285", "Jerry F Tate", "BOP"],
// ["ASDF240", "Jeff Hill", "WC"],
// ["ASDF291", "Jake Sab", "BOP"],
// ["ASDF301", "Mary Stein", "WC"],
// ["ASDF245", "Hello Dup", "BOP"],
// ["ASDF245", "Hello Dup", "WC"]
// ]✅ 关键优势说明:
- 零冗余逻辑:无需单独统计客户出现频次(如 count === 1 分支),也无需分组后二次遍历;
- 天然保序:Object.values() 返回顺序与属性插入顺序一致(ES2015+ 规范保证),结果严格按原始数组中各组合首次出现位置排列;
- 高可读性与可维护性:语义清晰(key = name-product),易于扩展(如增加地区字段:${name}-${product}-${region});
- 性能优秀:时间复杂度 O(n),空间复杂度 O(k)(k 为唯一组合数),远优于多重嵌套循环的 O(n²)。
⚠️ 注意事项:
- 若客户名或产品码本身含连字符 -,建议改用更安全的分隔符(如 \u0000 或 |),或使用 JSON.stringify([name, product]) 作为键;
- 在旧版环境(不支持 ||=)中,可替换为 uniqueMap[key] = uniqueMap[key] || [id, name, product];;
- 此方案默认保留原始数组结构;若需返回新数组而不修改原数据,已天然满足(未使用 push/splice 等变异操作)。
总结:面对多维嵌套数组的复合去重需求,善用 JavaScript 对象的键唯一性与现代语法(解构、模板字符串、逻辑赋值),往往比手动模拟哈希表或多重条件判断更简洁、健壮且符合工程实践。


















