Angular中移除数组重复月份值的代码未达预期,如何排查错误?
原代码的问题定位
- 数据源初始化不完整:
let tab1:any=[month];仅将单个月份变量作为数组唯一元素,没有装入包含重复值的全量月份数据集,循环遍历的对象本身就不符合去重的前置要求。 - 对比逻辑存在本质错误:代码在循环中不断向
tab2数组push元素,后续却拿整个tab2数组对象和单个元素tab1[index]做不相等判断。由于数组是引用类型,和字符串/数字类型的月份值做对比时永远不相等,这个判断分支从设计上就不可能达成预期目的。 - 缺失去重核心逻辑:整个流程没有“校验当前元素是否已经在结果集中存在”的关键判断,完全不具备去重能力。
- 入栈对象错误:即使if分支意外触发,推入
tab3的是tab2整个数组,而非单个月份值,最终会得到多层嵌套的数组结构,无法输出扁平的去重月份列表。 - 临时变量完全失效:
tab2从定义开始持续累计元素,长度最终会和源数组完全一致,从未承担“临时存储已遍历元素用于校验”的作用,属于无效定义的冗余变量。
可运行的正确实现方案
极简实现(适配现代TS/JS环境)
利用Set天然去重的特性,几行代码即可完成需求:
// 替换为实际的带重复值的源月份数组 const sourceMonthData: any[] = ["1月", "2月", "1月", "4月", "2月"] // 直接得到无重复值的月份列表 const uniqueResult = [...new Set(sourceMonthData)] console.log("tab3 :", uniqueResult)
基于原遍历框架的修正实现
保留原有的for循环结构,修正逻辑后即可正常去重:
const tab1: any[] = sourceMonthData // 传入完整的带重复值的源月份数组 const tab3: any[] = [] for (let index = 0; index < tab1.length; index++) { const currentMonth = tab1[index] // 核心去重判断:仅当结果数组中不存在当前元素时,才推入结果集 if (!tab3.includes(currentMonth)) { tab3.push(currentMonth) } } console.log("tab3 :", tab3)
内容的提问来源于stack exchange,提问作者MrHAvk Hcker
相关产品推荐
相关产品推荐

