如何在JavaScript中通过键值对的值获取对应的键?
通过值反向查找对象的键
嘿,我懂你的困扰——JavaScript对象本身确实没有内置的反向查找方法,你直接用tabList[#media]不行有两个原因:一是#media不是合法的语法(得用引号包起来变成'#media'),二是对象的键是数字0-4,它根本没有'#media'这个键,所以当然拿不到对应的值~
下面给你几种实用的解决办法:
方法1:写一个遍历查找的函数
如果只是偶尔需要反向查找,写个小函数遍历对象就行:
function getKeyByValue(obj, targetValue) { // 遍历对象的每个键 for (const key in obj) { // 只检查对象自身的属性(避免原型链上的属性干扰) if (obj.hasOwnProperty(key)) { // 找到匹配的值就返回对应的键 if (obj[key] === targetValue) { return key; } } } // 如果没找到匹配值,返回null或者你需要的默认值 return null; } // 用你的对象测试一下 var tabList = {0:'#description', 1:'#media', 2:'#attributes', 3:'#calendar', 4:'#pricing'}; console.log(getKeyByValue(tabList, '#media')); // 输出 '1' console.log(getKeyByValue(tabList, '#pricing')); // 输出 '4'
方法2:预先创建反向映射对象
如果需要频繁做反向查找,建议提前生成一个值→键的反向对象,这样每次查找都是O(1)的效率,比遍历快很多:
var tabList = {0:'#description', 1:'#media', 2:'#attributes', 3:'#calendar', 4:'#pricing'}; // 创建反向映射 const reverseTabMap = {}; for (const key in tabList) { if (tabList.hasOwnProperty(key)) { // 把原对象的值作为新对象的键,原对象的键作为新对象的值 reverseTabMap[tabList[key]] = key; } } // 现在直接用值找键就很方便啦 console.log(reverseTabMap['#media']); // 输出 '1' console.log(reverseTabMap['#attributes']); // 输出 '2'
注意点:处理重复值的情况
如果你的对象里存在重复的value,上面的方法只会返回最后一个匹配的键(因为后面的键会覆盖前面的)。如果需要返回所有匹配的键,可以把函数改成返回数组:
function getKeysByValue(obj, targetValue) { const matchedKeys = []; for (const key in obj) { if (obj.hasOwnProperty(key) && obj[key] === targetValue) { matchedKeys.push(key); } } return matchedKeys; }
内容的提问来源于stack exchange,提问作者xslibx
相关产品推荐
相关产品推荐

