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

如何根据列条件从二维数组中返回唯一元素?

问题与修复方案

我试过一个解决方案,但没能得到预期结果。

预期输出:

[
  [4, "frente", 196],
  [5, "frente", 196]  
]

我的当前代码:

function getUniqueData(arr = [
  [4, "frente", 196],
  [4, "frente", 196],
  [5, "frente", 196]  
], uniqueCols = [0]) {
  const uniqueData = arr.filter((currentRow, i) => {
    const currentCombo = uniqueCols.map(index => currentRow[index]);
    return !arr.some((row, j) => {
      const combo = uniqueCols.map(index => row[index]);
      return combo.every((c1, k) => c1 === currentCombo[k]) && i !== j;
    });
  });
  return uniqueData;
}
console.log(getUniqueData())

问题分析

当前代码的逻辑是:如果当前行在数组中存在其他索引不同但组合相同的行,就过滤掉当前行。这会导致所有重复出现的行都被过滤,最终只留下完全没有重复的行(比如示例里只会保留[5, "frente", 196]),不符合保留每个唯一组合一行的需求。

修复后的代码

改用Set记录已出现的组合,只保留每个组合的第一次出现:

function getUniqueData(arr = [
  [4, "frente", 196],
  [4, "frente", 196],
  [5, "frente", 196]  
], uniqueCols = [0]) {
  const seen = new Set();
  return arr.filter(row => {
    // 把指定列的值拼接成唯一键,避免引用类型无法直接比较
    const key = uniqueCols.map(index => row[index]).join('|');
    if (!seen.has(key)) {
      seen.add(key);
      return true;
    }
    return false;
  });
}
console.log(getUniqueData())

这段代码会遍历数组,每遇到一个未记录过的组合就加入Set并保留该行,重复的组合直接过滤,最终得到想要的去重结果。

内容的提问来源于stack exchange,提问作者onit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:22:02