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

如何过滤线段数组?实现忽略端点顺序的线段匹配过滤

解决方案

要实现这个需求,核心是修改线段相等的判断逻辑——允许线段的两个端点交换顺序。我们可以基于原有的点相等判断函数,扩展出线段相等的判断逻辑,再结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 16:27:26