JavaScript实现二维数组按指定多列值去重并保留首次出现项
二维数组按指定多列去重(保留首次出现条目)
需求场景
现有如下二维数组:
var array = [ [ 1, "Hello", "red", 0, "yes"], [ 2, "Hello", "red", 1, "no"], [ 3, "Hello", "blue", 4, "no"], [ 4, "Sunshine", "yellow", 5, "yes"], [ 5, "Hello", "red", 6, "yes"], // 更多数据 ]
需要基于指定的多列(示例为第2、3、5列)去重,重复项仅保留第一次出现的记录,预期处理结果如下:
array = [ [ 1, "Hello", "red", 0, "yes"], [ 2, "Hello", "red", 1, "no"], [ 3, "Hello", "blue", 4, "no"], [ 4, "Sunshine", "yellow", 5, "yes"], // 其余非重复项 ]
其中Hello, red, yes三个值在指定列上和第一条记录完全匹配,因此第五条记录会作为重复项被移除。
原有代码问题
原实现存在两处核心错误:
- 列索引取值错误:JS数组下标从0开始计数,第2、3、5列对应下标为1、2、4,原代码拼接key时取的是下标0、1、6,下标6在长度为5的子数组中不存在,无法生成正确的去重标识
- 输出对象错误:代码最后打印的是原始未处理的
array,而非去重后生成的result数组,无法看到正确处理结果
可直接运行的修复方案
将需要去重的列索引统一抽成配置项,遍历行时动态拼接唯一标识即可,后续调整去重列只需要修改配置数组,无需改动核心逻辑:
function pullgm() { // Google Apps Script 表格操作代码,实际在表格环境运行时取消注释即可 // const ss = SpreadsheetApp.getActiveSpreadsheet() // const sh2 = ss.getSheetByName("GP") // const sh3 = ss.getSheetByName("GM") // const lr2 = sh2.getLastRow() // const lc2 = sh2.getLastColumn() // const lr3 = sh3.getLastRow() // const lc3 = sh3.getLastColumn() // 从表格读数据时替换下方测试数组即可 // var array = sh2.getRange(1, 1, lr2, lc2).getValues() var array = [ [1, 'Hello', 'red', 0, 'yes'], [2, 'Hello', 'red', 1, 'no'], [3, 'Hello', 'blue', 4, 'no'], [4, 'Sunshine', 'yellow', 5, 'yes'], [5, 'Hello', 'red', 6, 'yes'], ]; // 配置去重列对应的下标,需要改去重规则只改这个数组就行 const dedupColIndexes = [1, 2, 4]; const existMap = Object.create(null); const result = []; for (let i = 0; i < array.length; i++) { const row = array[i]; // 按指定列拼接唯一key,用数据中不会出现的字符做分隔符避免冲突 const rowKey = dedupColIndexes.map(idx => row[idx]).join('|'); if (!existMap[rowKey]) { existMap[rowKey] = true; result.push(row.slice()); } } console.log('去重完成,结果为:', result); // 需要写回表格时取消下方注释 // sh3.clearContents(); // sh3.getRange(1, 1, result.length, result[0].length).setValues(result); return result; } pullgm();
实现说明
- 去重规则配置和核心逻辑解耦,调整去重列不需要修改循环代码,维护成本低
- 用
Object.create(null)创建无原型的空对象做去重标记,避免原型属性带来的判断误差 - 拼接key用的
|分隔符可以根据实际数据情况替换,只要保证分隔符不会出现在业务数据中就不会出现key冲突 - 保留了原代码中Google Apps Script操作表格的逻辑,在表格环境中只需要替换数据源、打开写回逻辑的注释即可直接使用
- 运行后第五条记录会被正确过滤,输出结果和预期完全一致
内容的提问来源于stack exchange,提问作者Sharad Gurung
相关产品推荐
相关产品推荐

