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

如何使用JavaScript移除数组中的重复坐标点?

如何用JavaScript移除数组中坐标重复的Point对象?

嘿,我来帮你搞定这个问题!首先明确你的场景:你有一个包含Point类型对象的数组,每个对象都带有X、Y坐标和一些方法(比如rotate、move),其中部分对象的坐标完全重复(比如索引0和3的点),需要移除这些重复项,只保留每个坐标唯一的Point对象。

先把你的示例数组整理成可运行的代码格式:

const points = [
  { X: 181708.79357001217, Y: 659243.26713151, rotate: () => {}, move: () => {}, resize: () => {} },
  { X: 182534.29357001217, Y: 657010.1837981766, rotate: () => {}, move: () => {}, resize: () => {} },
  { X: 186545.37690334552, Y: 660957.76713151, rotate: () => {}, move: () => {}, resize: () => {} },
  { X: 181708.79357001217, Y: 659243.26713151, rotate: () => {}, move: () => {}, resize: () => {} }
];

下面给你几种实用的实现方法,你可以根据自己的场景选择:

方法1:利用Set+字符串化坐标快速去重

因为Point是引用类型,直接用Set无法识别重复的坐标(对象引用不同),所以我们可以把每个点的X和Y拼接成唯一字符串作为标识,让Set帮我们自动去重:

const uniquePoints = Array.from(new Set(points.map(point => `${point.X},${point.Y}`)))
  .map(str => {
    const [x, y] = str.split(',').map(Number);
    return points.find(p => p.X === x && p.Y === y);
  });

思路说明:

  1. 先用map把每个Point转成"X值,Y值"格式的字符串,存入Set后会自动剔除重复的字符串
  2. 再把去重后的字符串转回到对应的Point对象

⚠️ 注意浮点数精度问题:如果你的坐标是计算生成的,可能存在微小的精度差异(比如181708.79357001217和181708.79357001218),这时候直接拼接会误判为不同点。可以先对坐标做四舍五入处理,比如保留6位小数:

// 封装生成唯一标识的函数
const getPointKey = point => `${point.X.toFixed(6)},${point.Y.toFixed(6)}`;

const uniquePoints = Array.from(new Set(points.map(getPointKey)))
  .map(key => points.find(p => getPointKey(p) === key));

方法2:用Map一次遍历完成(性能更优)

如果你的数组元素很多,推荐用这个方法,只需要遍历一次数组,效率更高:

const pointMap = new Map();

points.forEach(point => {
  // 同样可以根据需要添加精度处理
  const key = `${point.X},${point.Y}`;
  // 只存储第一次出现的点
  if (!pointMap.has(key)) {
    pointMap.set(key, point);
  }
});

// 把Map中的值转成数组就是去重后的结果
const uniquePoints = Array.from(pointMap.values());

这个方法的核心是用Map的键存储坐标标识,值存储对应的Point对象,遍历过程中只保留第一次出现的点,避免重复存储。

方法3:手动遍历对比(逻辑最直观)

如果你不想用Set或Map,也可以手动维护一个已处理坐标的列表,逐个判断是否重复:

const uniquePoints = [];
const seenPointKeys = [];

points.forEach(point => {
  const key = `${point.X},${point.Y}`;
  // 如果这个坐标没出现过,就加入结果数组
  if (!seenPointKeys.includes(key)) {
    seenPointKeys.push(key);
    uniquePoints.push(point);
  }
});

这个方法逻辑简单易懂,但includes的时间复杂度是O(n),所以整体是O(n²)的时间复杂度,数据量大的时候性能不如前两种方法,适合小体量的数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:42:43