如何获取array数组中unique values(唯一值)对应的index索引
获取数组唯一值对应索引的实现方案
以下方案默认返回每个唯一值首次出现的索引,可根据需求调整为返回末次出现的索引。
方案1:单次遍历实现(时间复杂度O(n),适合大数组)
通过Set记录已经出现过的值,遍历过程中直接收集符合要求的索引,仅需遍历数组一次,性能最优。
function getUniqueIndexes(arr) { const existed = new Set() return arr.reduce((result, val, idx) => { if (!existed.has(val)) { existed.add(val) result.push(idx) } return result }, []) } // 测试用例 const testArray = ['a', 'b', 'a', 'c', 'b', 'd'] console.log(getUniqueIndexes(testArray)) // 输出:[0, 1, 3, 5]
方案2:极简写法(时间复杂度O(n²),适合小数组)
利用Array.indexOf会返回元素首次出现位置的特性,直接过滤非首次出现的索引即可,代码更短。
const getUniqueIndexes = arr => arr .map((_, idx) => idx) .filter(idx => arr.indexOf(arr[idx]) === idx)
场景适配
如果需要获取每个唯一值最后一次出现的索引,可使用Map记录每个值的最新索引,最终提取所有值即可:
function getLastUniqueIndexes(arr) { const valToIndex = new Map() arr.forEach((val, idx) => valToIndex.set(val, idx)) return Array.from(valToIndex.values()) } // 测试用例输入['a', 'b', 'a', 'c', 'b', 'd'],输出:[2, 4, 3, 5]
如果需要判断引用类型(对象、数组)的唯一性,可自定义唯一标识生成逻辑,替换Set/Map的键为自定义标识即可。
内容的提问来源于stack exchange,提问作者christopher
相关产品推荐
相关产品推荐

