如何过滤线段数组?实现忽略端点顺序的线段匹配过滤
解决方案
要实现这个需求,核心是修改线段相等的判断逻辑——允许线段的两个端点交换顺序。我们可以基于原有的点相等判断函数,扩展出线段相等的判断逻辑,再结合filter和some完成过滤。
完整代码实现
// 判断两个坐标点是否完全一致 let isSamePoint = (arr1, arr2) => arr1.length === arr2.length && arr1.every((element, index) => element === arr2[index]); // 判断两条线段是否相等(端点顺序互换仍视为同一条) let isSameSegment = (seg1, seg2) => { // 处理单个点的情况(比如示例中的[3,6]、[7,3]) if (seg1.length !== 2 || seg2.length !== 2) { return isSamePoint(seg1, seg2); } // 两种匹配情况:端点顺序相同,或端点顺序互换后相同 return (isSamePoint(seg1[0], seg2[0]) && isSamePoint(seg1[1], seg2[1])) || (isSamePoint(seg1[0], seg2[1]) && isSamePoint(seg1[1], seg2[0])); }; // 原始数据 let big_coordinates_arr =[ [[1,2],[3,4]], [[3,4],[1,2]] , [[5,8],[7,9]] , [[7,1],[6,5]] , [3,6],[7,3] ] ; let small_coordinates_arr=[ [[3,4],[1,2]] , [[7,1],[6,5]] ] ; // 过滤出大数组中不在小数组内的线段/点 let result = big_coordinates_arr.filter(item => !small_coordinates_arr.some(seg => isSameSegment(item, seg))); console.log(result); // 输出:[ [ [5,8],[7,9] ], [3,6], [7,3] ]
关键逻辑说明
isSamePoint:复用原逻辑,确保两个坐标点的长度和每个位置的数值完全匹配。isSameSegment:- 先兼容单个点的情况,直接调用点相等判断。
- 对于标准线段,同时检查两种匹配可能性:端点顺序完全一致,或者端点互换后一致。
- 过滤逻辑:用
filter遍历大数组,对每个元素,通过some配合线段相等判断,确认它是否不在小数组中,符合条件的元素保留下来。
内容的提问来源于stack exchange,提问作者Johnathan Wick
相关产品推荐
相关产品推荐

