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

如何实现碰撞器逻辑:比较对象数组并返回x、y值相同的对象索引

找出数组中x与y值均相同的对象索引

嘿,这个碰撞检测的需求很常见,我给你一个高效的实现思路,分分钟搞定!

核心思路

我们可以用一个**映射表(Map)**来记录每个(x,y)坐标组合对应的对象索引列表,遍历一次数组就能完成统计,然后筛选出那些有多个索引的坐标组——这些就是你要找的碰撞对象的索引啦。

代码实现(JavaScript)

先给你一个完整的示例,我特意加了一个重复坐标的对象方便演示:

// 你的原始数组,我加了一个重复x,y的对象
const objects = [ 
  {x: 615, y: 293, a: 1}, 
  {x: 340, y: 439, a: 0}, 
  {x: 292, y: 505, a: 0},
  {x: 340, y: 439, a: 2} // 这个和第二个对象x,y完全相同
];

// 1. 构建坐标到索引列表的映射
const positionMap = new Map();
objects.forEach((obj, index) => {
  // 用`x,y`字符串作为唯一键,确保相同坐标的对象能被归到同一组
  const key = `${obj.x},${obj.y}`;
  if (!positionMap.has(key)) {
    positionMap.set(key, []);
  }
  positionMap.get(key).push(index);
});

// 2. 筛选出有多个索引的条目(也就是x,y重复的对象组)
const duplicateIndexGroups = Array.from(positionMap.values())
  .filter(indices => indices.length > 1);

console.log(duplicateIndexGroups); // 输出: [[1, 3]]

额外扩展

如果你不想分组,而是要把所有重复的索引平铺成一个数组,可以这么做:

const allDuplicateIndices = [].concat(...duplicateIndexGroups);
console.log(allDuplicateIndices); // 输出: [1, 3]

为什么用Map?

这个方法的时间复杂度是O(n)(n是数组长度),比嵌套循环对比的O(n²)高效太多了,尤其是当你的对象数组很大的时候,性能优势会非常明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:05:29