如何获取数组中相同id对应最后一个元素 现有代码输出不符合预期
问题分析与修复方案
错误原因
Array.prototype.reverse()是原地修改方法,会直接变更原数组的元素顺序,不会生成新的数组副本。你调用reverse()后,后续findIndex用到的array变量已经是倒序后的数组,和你预期的查找基准不符。- 原有代码的
findIndex直接引用外部的array变量,没有绑定当前正在过滤的数组实例,逻辑耦合导致结果出错,最终得到了每个id对应第一项的错误结果。
修复方法
方案1:调整原有实现逻辑
反转前先对原数组做浅拷贝避免修改原数据,过滤时直接使用当前遍历的数组实例做查找,最后把结果反转回原id升序顺序即可:
const result = array ?.slice() // 浅拷贝原数组,不修改原数据 .reverse() .filter((ele, ind, currentArr) => ind === currentArr.findIndex((elem) => elem?.id === ele?.id)) .reverse() // 还原为id升序的结果顺序
方案2:更高性能的O(n)复杂度实现
用Map遍历一次数组即可,相同id的项会自动覆盖为最后出现的值,不会修改原数组,大数据量下性能优势明显:
const result = Array.from( array?.reduce((map, item) => { map.set(item.id, item) return map }, new Map()).values() )
两种方案执行后都可以得到你期望的输出:[{id:1,name:"C++"},{id:2,name:"Php"}]
内容的提问来源于stack exchange,提问作者Subodh shakya
相关产品推荐
相关产品推荐

