如何对嵌套线段数组进行去重以移除重复线段?
线段数组去重方案
需求说明
给定嵌套数组,每个元素为[[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
相关产品推荐
相关产品推荐

