JavaScript如何根据数组或对象的值查找返回对应键名
问题解答
首先纠正你写法里的核心误区:JavaScript中Array是基于数字索引的有序集合,你尝试给数组加字符串键的写法,本质是给数组对象挂载自定义属性,这些属性不会被.indexOf()、.findIndex()这类数组遍历方法识别,这种键值对映射场景不要用数组存储。
单值匹配获取对应键
你给出的var pessoas = {'car': 'Ferrari', 'car2':'BMW'}是标准的普通对象写法,也是键值对场景的推荐存储结构之一,要通过值找第一个匹配的键,直接遍历对象的键值对即可:
const pessoas = {'car': 'Ferrari', 'car2':'BMW'}; function getKeyByValue(obj, target) { for (const [key, value] of Object.entries(obj)) { if (value === target) return key; } return undefined; // 无匹配时返回undefined } // 调用测试 console.log(getKeyByValue(pessoas, 'Ferrari')); // 输出: car
多值匹配获取所有对应键
如果和你最开始写的PHP示例一样,存在多个键对应同一个值的情况,把匹配到的键收集到数组返回即可:
function getAllKeysByValue(obj, target) { const matchKeys = []; for (const [key, value] of Object.entries(obj)) { if (value === target) matchKeys.push(key); } return matchKeys; } // 对应PHP示例的测试场景 const fruitMap = { fruit1: 'apple', fruit2: 'orange', fruit3: 'grape', fruit4: 'apple', fruit5: 'apple' }; console.log(getAllKeysByValue(fruitMap, 'apple')); // 输出: ['fruit1', 'fruit4', 'fruit5']
存储结构选择说明
- 如果你要存储的是按下标排序的元素列表,用
Array - 如果你要存储键值对映射关系:
- 键都是字符串/Symbol类型、没有频繁增删操作的场景,用普通对象
{}即可 - 键需要支持任意类型、有频繁增删查询需求的场景,用ES6新增的
Map结构更合适
- 键都是字符串/Symbol类型、没有频繁增删操作的场景,用普通对象
- 不存在"该场景用Class更合适"的说法,Class是面向对象的语法糖,类实例本质也是对象,上面写的查找键的方法对类实例完全生效,参考示例:
class CarList { constructor() { this.car = 'Ferrari'; this.car2 = 'BMW'; } } const cars = new CarList(); console.log(getKeyByValue(cars, 'BMW')); // 输出: car2
注意:不要给数组挂载字符串键属性,这种写法下数组的
length不会统计这些属性,所有数组原生遍历方法都会忽略这些属性,属于不符合数组设计意图的错误用法。
内容的提问来源于stack exchange,提问作者Kleuton Novais
相关产品推荐
相关产品推荐

