如何获取仅在第一个对象数组属性中的元素?代码正确性存疑
获取仅存在于第一个对象delegators数组中的元素
你需要筛选出仅出现在obj1.delegators中的元素,先看你写的代码:
export const findUncommonAddresses = (obj1, obj2) => { let arr1 = obj1.delegators let arr2 = obj2.delegators let difference = arr1.filter(addr1 => !arr2.includes(addr1)); return difference; }
代码逻辑的正确性
这段代码的逻辑是对的:遍历obj1.delegators,只保留那些不在obj2.delegators中的元素,确实能得到仅出现在第一个数组里的元素。
结果长度与total差值不符的原因
你发现返回的数组长度和obj1.total - obj2.total(2065-1109=947)不一致,大概率是以下原因:
- total统计逻辑和数组内容不匹配:比如
obj1.total统计的是去重前的委托者数量,而delegators数组里是去重后的内容;或者total是去重后的计数,数组里存在重复元素。 - 数组包含重复元素:如果
obj1.delegators里有重复项(比如多次出现tx01),而obj2.delegators里包含tx01,那filter会把所有tx01都排除,此时结果长度会是obj1.delegators.length减去重叠元素的总出现次数,而非去重后的数量差。 - total统计有误:
obj1.total或obj2.total的数值和对应delegators数组的实际长度不匹配。
优化方案(处理重复元素场景)
如果需要的是去重后仅存在于obj1中的元素,可以用Set来优化,同时提升查找效率(Set.has()比Array.includes()更快):
export const findUncommonAddresses = (obj1, obj2) => { const delegatorsSet1 = new Set(obj1.delegators); const delegatorsSet2 = new Set(obj2.delegators); return [...delegatorsSet1].filter(addr => !delegatorsSet2.has(addr)); }
这段代码先把两个数组转成Set去重,再筛选出仅在第一个Set中的元素,得到的是唯一值的集合。此时你可以对比这个结果的长度和去重后的数量差是否匹配。
补充说明
如果你的需求是保留原数组中的重复项(比如obj1里重复的元素只要不在obj2里就全部保留),那你原来的代码没问题,结果长度和total差值不一致只是因为total的统计逻辑和数组实际内容不匹配,和代码逻辑无关。
内容的提问来源于stack exchange,提问作者code_learner93
相关产品推荐
相关产品推荐

