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

如何获取仅在第一个对象数组属性中的元素?代码正确性存疑

获取仅存在于第一个对象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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 18:43:12