如何不使用null实现JS数组重复校验与非重复元素追加
数组非重复合并无需null占位的实现方案
你当前代码出现无意义null的核心原因是错把三元表达式用在了仅需执行条件副作用的场景:三元是用来返回值的表达式,两个分支必须都有返回结果,才需要用null做无意义占位,这类场景优先用条件语句实现,根本不需要占位值。
以下是几种可直接替换的实现方案:
方案1:直接替换为if判断(最贴合原有逻辑、可读性最高)
完全保留原有的「遍历array2、元素不存在则push到array1」的逻辑,删掉三元表达式,用基础条件判断即可,全程不会产生无意义的null值:array2.forEach((item) => { if (!array1.includes(item)) { array1.push(item) } })方案2:利用逻辑短路实现极简写法(适合个人脚本等轻量场景)
利用&&的短路特性:前面的判断条件为真时才会执行后面的push操作,不需要写三元分支,也不需要null占位:array2.forEach(item => !array1.includes(item) && array1.push(item))注意:这种写法可读性弱于if判断,团队协作的项目不推荐使用,避免增加后续维护成本。
方案3:用Set实现高性能去重合并(适合数据量较大的场景)
原写法中array1.includes(item)每次都要遍历array1查找,时间复杂度为O(n*m),数组越大执行越慢。用Set结构做查找的时间复杂度为O(1),整体性能提升明显:
如果不需要保留原array1的引用,直接生成新的合并数组可以写得非常简洁:const mergedArray = [...new Set([...array1, ...array2])]如果需要和原逻辑一致、在原array1对象上做追加(不改变array1的引用地址),可以这么写:
const existedSet = new Set(array1) array2.forEach(item => { if (existedSet.has(item)) return existedSet.add(item) array1.push(item) })
内容的提问来源于stack exchange,提问作者user18241178
相关产品推荐
相关产品推荐

