如何校验对象全属性值 高效移除数组中重复的3D向量对象
3D向量数组全属性去重方案
核心原理
JavaScript中对象是引用类型,直接通过全等运算符(===)或者单属性值比对无法准确判定全属性匹配的重复项:
- 引用比对会把属性完全一致但内存地址不同的对象判定为不重复
- 单属性比对会出现某一属性值相同、其他属性不同的对象被误删的问题
针对数百到数千条数据的处理规模,使用哈希表标记已出现项的方案时间复杂度为O(n),性能完全满足要求,且可以做到全属性校验无遗漏。
适用于当前场景的实现(完全值匹配)
你提到的重复项是渲染环节生成的法线冗余数据,这类重复项的x/y/z三个坐标值是逐位完全相等的,直接将三个属性序列化为字符串作为唯一哈希键即可快速去重:
const vectors = [ {x: 6.869495194905539e-9, y: -0.11905603855848312, z: -0.3318425416946411}, {x: 6.869495194905539e-9, y: -0.11905603855848312, z: -0.3318425416946411}, {x: 6.869495194905539e-9, y: -0.11905603855848312, z: -0.3318425416946411}, {x: 0.06476999074220657, y: -0.11905603855848312, z: -0.3254662752151489}, {x: 0.06476999074220657, y: -0.11905603855848312, z: -0.3254662752151489}, {x: 0.06476999074220657, y: -0.11905603855848312, z: -0.3254662752151489}, {x: 0.06476999074220657, y: -0.11905603855848312, z: -0.3254662752151489}, {x: 0.12705090641975403, y: -0.11905603855848312, z: -0.306582510471344}, {x: 0.12705090641975403, y: -0.11905603855848312, z: -0.306582510471344}, {x: 0.12705090641975403, y: -0.11905603855848312, z: -0.306582510471344}, // 其余数据省略 ] function deduplicate3DVectors(vecList) { const existedSet = new Set(); return vecList.filter(vec => { // 拼接三个坐标值作为唯一标识,只有三个值完全一致才会判定为重复 const uniqueKey = `${vec.x},${vec.y},${vec.z}`; if (existedSet.has(uniqueKey)) return false; existedSet.add(uniqueKey); return true; }); } // 得到去重后的数组 const uniqueVectors = deduplicate3DVectors(vectors);
扩展说明
如果后续场景涉及浮点数计算误差(比如两个本应相等的坐标因为计算精度差了1e-10量级),可以给比对逻辑增加容差阈值:将坐标按容差精度取整后再生成哈希键,或者用空间分桶的方式减少比对次数。但当前处理的是渲染管线输出的固定值重复数据,上面的基础实现已经足够,千条数据处理耗时在1ms级别,不会有性能瓶颈。
内容的提问来源于stack exchange,提问作者Defgun
相关产品推荐
相关产品推荐

