如何基于指定列去除多维数组中的重复项
二维数组按任意指定列去重的实现
你现有的代码只能按第一列(Header1)去重,核心原因是用了解构([key])直接取了数组的第一个元素作为判断重复的标识。要实现按指定列(比如Header2)或任意列p去重,只需修改获取去重判断键的逻辑即可,以下是具体实现方案:
一、按指定列(如Header2)去重
Header2对应数组的第2个元素,索引为1(数组索引从0开始计数),修改filter回调中取键的逻辑即可:
function dedupByHeader2() { const data = [ ['Header1', 'Header2'], ['S01', 'C01'], ['S01', 'C02'], ['S02', 'C03'], ['S04', 'C02'] // 新增Header2重复的测试用例 ]; const seen = {}; // 取数组第2个元素(索引1)作为去重判断键 const result = data.filter(item => { const key = item[1]; return !seen[key] && (seen[key] = true); }); console.log(result); }
执行后会保留首次出现的['S01', 'C01']、['S01', 'C02']、['S02', 'C03'],自动剔除后续重复的['S04', 'C02']。
二、泛化到任意指定列p的通用函数
将目标列的索引作为参数传入函数,即可实现对任意列的去重(注意列索引p从0开始计数,比如Header1对应p=0,Header2对应p=1):
function dedupByColumn(data, columnIndex) { const seen = {}; return data.filter(item => { const key = item[columnIndex]; // 处理数组长度不足指定列的情况,默认保留该元素 if (key === undefined) return true; return !seen[key] && (seen[key] = true); }); } // 使用示例 const data = [ ['Header1', 'Header2'], ['S01', 'C01'], ['S01', 'C02'], ['S02', 'C03'], ['S04', 'C02'] ]; // 按Header2(索引1)去重 const resultByHeader2 = dedupByColumn(data, 1); // 按Header1(索引0)去重 const resultByHeader1 = dedupByColumn(data, 0); console.log('按Header2去重结果:', resultByHeader2); console.log('按Header1去重结果:', resultByHeader1);
特殊场景处理
如果去重键是对象、数组等复杂类型,普通对象seen无法正确存储,需改用Map实现:
function dedupByColumnComplex(data, columnIndex) { const seen = new Map(); return data.filter(item => { const key = item[columnIndex]; if (!seen.has(key)) { seen.set(key, true); return true; } return false; }); }
内容的提问来源于stack exchange,提问作者Einarr
相关产品推荐
相关产品推荐

