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

JavaScript中移除二维数组的完全重复与相似重复项

修正后的代码实现

要同时移除二维数组中的完全重复项和相似重复项(元素相同、顺序相反的二元数组),并保留符合预期的元素,我们需要将每个子数组的排序后形态作为唯一标识,以此判断是否属于相似组,同时优先保留原数组中升序排列的元素(或最后出现的升序元素)。

修正后的代码如下:

let a = [
  [5, 6],
  [1,1],
  [6,5],
  [1,1],
  [3,2],
  [2,3]
]

function makeUnique(arr) {
  const itemsFound = {};
  arr.forEach(item => {
    // 生成当前子数组的排序版本(不修改原数组)
    const sorted = [...item].sort((x, y) => x - y);
    const key = JSON.stringify(sorted);
    
    if (!itemsFound[key]) {
      // 若该相似组未被记录,优先保留原数组中的升序元素,否则存入排序后的标准形态
      itemsFound[key] = JSON.stringify(item) === key ? item : sorted;
    } else {
      // 若已记录,若当前元素是升序形态,则更新为当前元素(保留最后出现的升序项)
      if (JSON.stringify(item) === key) {
        itemsFound[key] = item;
      }
    }
  });
  // 将记录的唯一元素转为数组返回
  return Object.values(itemsFound);
}

a = makeUnique(a);
console.log(a); // 输出: [ [ 5, 6 ], [ 1, 1 ], [ 2, 3 ] ]

代码说明

  1. 唯一标识生成:通过将子数组排序后转为字符串,让相似数组(如[5,6]和[6,5])拥有相同的键,以此识别相似重复项。
  2. 元素保留规则:
    • 对于未记录的相似组,优先保留原数组中本身就是升序的元素;如果当前元素是降序,则存入升序的标准形态。
    • 对于已记录的相似组,若后续遇到升序形态的元素,更新为该元素(确保保留最后出现的升序项,如原数组中的[2,3])。
  3. 完全重复项处理:由于相同元素的排序后键一致,完全重复的元素会被自动去重。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 13:55:28