如何不遍历JS对象查找包含指定值对应的键?
解决方案
首先明确结论:原生普通JavaScript对象仅支持「键→值」的单向映射,没有内置反向索引,如果你不提前做数据结构预处理,不可能做到完全不迭代就通过值反向查找对应的键。
如果你的需求是每次调用查询函数时不需要迭代,可以提前遍历一次原数据集构建反向查找映射,后续所有查询都是O(1)时间复杂度,不需要再做迭代:
let data = { 1: ['item1', '3435'], 32: ['item2', '5465'], 16: ['item3', '6577'] } // 仅初始化时遍历一次,构建值到键的映射表 const valueToKeyMap = Object.fromEntries( Object.entries(data).map(([key, [_, numValue]]) => [numValue, key]) ) // 查询时直接取映射表,无任何迭代 function findKey(targetNum) { return valueToKeyMap[targetNum] } // 测试 findKey('3435') // 返回 "1",注:你给出的测试用例中3534为笔误 findKey('6577') // 返回 "16"
如果数据集后续有新增/修改/删除操作,同步更新valueToKeyMap映射表即可,不需要每次查询重新遍历。
如果你接受单次查询时执行迭代,也可以使用下面的简写写法,本质还是会遍历对象的所有键值对:
function findKey(targetNum) { return Object.keys(data).find(key => data[key][1] === targetNum) }
内容的提问来源于stack exchange,提问作者geek glance
相关产品推荐
相关产品推荐

