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

如何从一个坐标数组中过滤掉另一个坐标数组的元素?

二维坐标数组的过滤实现

给定以下JavaScript代码示例:

let big_coordinates_arr  =[ [1,2],[3,4],[5,8],[7,9]] ;
let small_coordinates_arr=[ [3,4],[7,9] ] ;

期望输出:[ [1,2],[5,8] ]

要实现从大坐标数组中过滤掉所有存在于小坐标数组里的元素,核心问题是数组是引用类型,直接用includes或===无法判断两个内容相同的坐标数组是否相等,可以用以下几种方案解决:

方案一:转字符串存入Set(高效推荐)

将坐标数组转为字符串形式,利用Set的快速查找特性提升效率:

// 将小数组的坐标转为字符串,存入Set
const smallCoordSet = new Set(small_coordinates_arr.map(coord => coord.join(',')));
// 过滤大数组,保留不在Set中的坐标
const filteredArr = big_coordinates_arr.filter(coord => !smallCoordSet.has(coord.join(',')));

console.log(filteredArr); // 输出: [ [1,2],[5,8] ]

这种方法的时间复杂度为O(n+m)(n是大数组长度,m是小数组长度),适合处理大数据量的场景。

方案二:JSON字符串化对比

如果坐标包含非数字类型(比如字符串),可以用JSON.stringify统一转成字符串后对比:

const smallCoordStrs = small_coordinates_arr.map(coord => JSON.stringify(coord));
const filteredArr = big_coordinates_arr.filter(coord => !smallCoordStrs.includes(JSON.stringify(coord)));

console.log(filteredArr); // 输出: [ [1,2],[5,8] ]

该方法兼容性更强,但字符串化的性能略低于join,适合复杂结构的坐标。

方案三:逐元素对比(小数据量适用)

如果数组规模较小,可以直接遍历小数组,对比坐标的每一项是否相等:

const filteredArr = big_coordinates_arr.filter(bigCoord => {
  // 检查小数组中是否存在与当前大坐标完全匹配的项
  return !small_coordinates_arr.some(smallCoord => {
    return bigCoord[0] === smallCoord[0] && bigCoord[1] === smallCoord[1];
  });
});

console.log(filteredArr); // 输出: [ [1,2],[5,8] ]

这种方法不需要额外转格式,但时间复杂度为O(n*m),数据量大时性能会下降。

内容的提问来源于stack exchange,提问作者Theodore John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:42:22