如何实现碰撞器逻辑:比较对象数组并返回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
相关产品推荐
相关产品推荐

