You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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结构更合适
  • 不存在"该场景用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:06:40