You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 00:09:21