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

如何对嵌套线段数组进行去重以移除重复线段?

线段数组去重方案

需求说明

给定嵌套数组,每个元素为[[x1,y1],[x2,y2]]格式的线段,需要移除数组中重复的线段(包含两种场景:数组内容完全一致的重复,以及线段两个点顺序互换的重复)。


场景1:仅移除数组内容完全一致的重复线段

适用于你的示例场景,即重复线段的点顺序完全相同:

const segmentArr = [[[1,4],[4,5]], [[5,6],[7,8]], [[9,6],[7,8]], [[1,4],[4,5]], [[10,6],[7,8]]];

// 将线段转为字符串作为唯一标识,利用Set自动去重
const uniqueSegments = [...new Set(segmentArr.map(seg => JSON.stringify(seg)))].map(str => JSON.parse(str));

console.log(uniqueSegments);
// 输出:[[[1,4],[4,5]], [[5,6],[7,8]], [[9,6],[7,8]], [[10,6],[7,8]]]

场景2:移除点顺序互换的重复线段

如果[[x1,y1],[x2,y2]]和[[x2,y2],[x1,y1]]属于同一条线段需要去重,先对线段做标准化处理:

const segmentArr = [[[1,4],[4,5]], [[4,5],[1,4]], [[5,6],[7,8]], [[9,6],[7,8]]];

// 标准化线段:将两个点按坐标排序(先比x轴,x相同则比y轴)
const normalizeSegment = (seg) => {
  const [p1, p2] = [...seg];
  if (p1[0] > p2[0] || (p1[0] === p2[0] && p1[1] > p2[1])) {
    return [p2, p1];
  }
  return [p1, p2];
};

// 基于标准化后的线段去重
const uniqueSegments = [...new Set(segmentArr.map(seg => JSON.stringify(normalizeSegment(seg))))].map(str => JSON.parse(str));

console.log(uniqueSegments);
// 输出:[[[1,4],[4,5]], [[5,6],[7,8]], [[9,6],[7,8]]]

注意事项

  • 上述方案依赖JSON.stringify和JSON.parse,仅适用于线段点为数字的情况;如果涉及浮点数,建议先通过toFixed(n)处理精度问题后再序列化。
  • 标准化逻辑可根据实际需求调整,比如优先比较y轴坐标等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 13:05:18