处理稀疏数组去重需先用Array.from({length:arr.length},(_,i)=>arr[i])将其转为密集数组,使空位显式变为undefined,再按业务需求filter;不可直接用Set,因会跳过空位且丢失长度信息。

处理稀疏数组去重时的空位问题,核心在于先“填平”空位,再按需去重。空位(empty slot)不是值,它不参与遍历、不触发 filter/map/forEach,也不能被 Set 或 indexOf 捕捉——直接去重会漏掉它,或误把空位当 undefined 处理。
先转成密集数组,再统一处理
稀疏数组中的空位必须显式转化为可识别的值(通常是 undefined),才能进入后续逻辑。推荐用 Array.from 构造新数组:
-
Array.from({ length: arr.length }, (_, i) => arr[i])—— 它会为每个索引取值,空位自动返回undefined,结果是长度不变、无空位的密集数组 - 之后可安全使用
filter、Set等方法,不再受空位干扰
去重前明确“哪些值该保留”
转为密集数组后,undefined 是真实存在的元素。是否剔除它,取决于业务语义:
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 只删
null和undefined:用.filter(item => item != null) - 还要保留
0、false、'':改用.filter(item => item !== undefined && item !== null) - 字符串要清空格再判断:
.filter(item => typeof item === 'string' ? item.trim() : item != null)
避免用 Set 直接去重稀疏数组
[1, , 2] 经 new Set(arr) 后仍是 Set {1, 2},但中间空位未被表示,也未被过滤——这不是“去重”,而是“跳过”。更严重的是,Array.from(new Set(arr)) 会丢失原始长度信息,无法还原稀疏结构意图。若需保留位置语义(比如对应表格某列),必须先密集化再操作。
验证空位是否存在,别靠 === undefined
arr[1] === undefined 为 true,不代表索引 1 存在。真正判断空位要用 1 in arr(返回 false);而 arr[1] = undefined 后,1 in arr 就变成 true。混淆这两者会导致误判数组结构,影响去重逻辑的起点。










