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

如何校验对象全属性值 高效移除数组中重复的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:36:18