如何从JSON响应数组中提取按title去重的唯一元素数组?
问题原因与修复方案
核心问题定位
- 循环边界设置错误:原循环终止条件为
i < data.length - 1,循环最远只遍历到倒数第二个元素,最后一个元素的title永远不会被纳入比较和推入逻辑,因此会丢失最后一个唯一元素 - 循环条件修改后的报错原因:将循环改为
i < data.length后,当i遍历到最后一个元素(即i = data.length - 1)时,代码会尝试访问data[i + 1].title,此时i + 1超出数组有效索引范围,data[i+1]为undefined,读取undefined的title属性就会触发运行报错 - 逻辑与需求不匹配:原函数最终返回的是
stack.length,如果你需要获取去重后的数组本身,需要将返回值调整为stack
原逻辑的适用前提
你当前的相邻比较逻辑,仅适用于数组已经按title值排序、相同title连续排列的场景,如果数组中相同title没有连续出现,逐位相邻比较的方式会出现重复值被推入数组的问题
可落地的修复方案
方案1:兼容原有相邻比较逻辑的修复
如果能保证数组已经按title排序好,可以避开越界访问,同时完整遍历所有元素:
const getPendingList = (data) => { if (!data || data.length === 0) return []; const stack = []; // 推入第一个元素的title作为初始值 stack.push(data[0].title); // 从第二个元素开始遍历,和上一个入栈的title比较 for (let i = 1; i < data.length; i++) { if (data[i].title !== stack[stack.length - 1]) { stack.push(data[i].title); } } console.log('stack', stack); return stack; }
方案2:无需依赖排序的通用去重方案
如果数组没有按title排序,直接用内置的去重逻辑实现,代码更简洁且无越界风险:
const getPendingList = (data) => { if (!data) return []; // 提取所有title值,用Set自动去重后转回数组 const stack = [...new Set(data.map(item => item.title))]; console.log('stack', stack); return stack; }
内容的提问来源于stack exchange,提问作者TRINA CHAUDHURI
相关产品推荐
相关产品推荐

