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

Node.js二维坐标数组indexOf查找索引返回-1问题

问题核心原因

JavaScript中数组属于引用类型,你的代码逻辑全程默认按引用做相等判定,和你预期的「按坐标值匹配」逻辑完全不匹配,两个关键错误点:

  • 你使用的交集计算函数,在把数组元素存入对象aa作为键时,会隐式把数组转成字符串(比如[53.7,-2.45]会被转为"53.7,-2.45"),这一步只是字符串内容碰巧相等,才筛出了值匹配的结果;但最终filter返回的元素,是直接从arrB中取出的原数组引用,和arrA里存的同值数组是内存中完全独立的两个实例。
  • indexOf方法内部使用严格相等(===)做判定,对引用类型来说,只有两个变量指向内存中同一个数组/对象时才会判定为相等。你拿到的key本质是arrB索引13位置的数组实例,和arrA[1]虽然存储的坐标值完全一致,但不是同一个引用,所以arrA.indexOf(key)会返回-1;反过来查arrB时,因为key本身就来自arrB,自然能得到正确索引13。
修正方案

不要依赖引用相等、隐式类型转换的巧合做匹配,显式按坐标值做比对,逻辑如下:

// 坐标值相等判断工具,若涉及浮点计算可按需增加精度容差
function isCoordSame(c1, c2) {
  return c1[0] === c2[0] && c1[1] === c2[1];
}

function getCoordIntersect(a, b) {
  const matchList = [];
  b.forEach((coordB, idxB) => {
    const idxA = a.findIndex(coordA => isCoordSame(coordA, coordB));
    if (idxA !== -1) {
      matchList.push({
        coord: coordB,
        idxA: idxA,
        idxB: idxB
      })
    }
  })
  return matchList;
}

// 原有arrA、arrB定义保持不变即可
const res = getCoordIntersect(arrA, arrB);
console.log(res[0]);
// 输出:{ coord: [53.7, -2.45], idxA: 1, idxB: 13 },完全符合预期

提示:地理坐标通常是浮点数,直接用===匹配可能遇到浮点数精度误差问题,实际使用时建议设置极小的容差值(比如1e-6)判断数值是否近似相等,避免漏匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 12:57:45