如何使用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); });
思路说明:
- 先用
map把每个Point转成"X值,Y值"格式的字符串,存入Set后会自动剔除重复的字符串 - 再把去重后的字符串转回到对应的
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
相关产品推荐
相关产品推荐

