Skip to content

在JavaScript对象中查找匹配的键

JavaScript对象通常被用作字典,其中键用于标识某些值。在这种情况下,通常有必要查找与给定值或条件匹配的所有键

查找所有匹配的键

使用Object.keys(),您可以将对象的所有键作为数组获取。然后,您可以使用Array.prototype.filter()测试每个键值对,并返回与给定条件匹配的所有键。

const findKeys = (obj, fn) =>
  Object.keys(obj).filter(key => fn(obj[key], key, obj));

const ages = {
  Leo: 20,
  Zoey: 21,
  Jane: 20,
};
findKeys(ages, x => x === 20); // [ 'Leo', 'Jane' ]

如果您只想简单地针对一个值进行测试,可以简化实现以接受单个值,而不是函数。在演示的通用实现中,回调函数接收三个参数 - 值、键和对象。

查找第一个匹配的键

如果您只需要第一个匹配的键,则使用Array.prototype.filter()效率较低。在这种情况下,Array.prototype.find()是更好的选择。

const findKey = (obj, fn) =>
  Object.keys(obj).find(key => fn(obj[key], key, obj));

findKey(
  {
    barney: { age: 36, active: true },
    fred: { age: 40, active: false },
    pebbles: { age: 1, active: true }
  },
  x => x['active']
); // 'barney'

查找最后一个匹配的键

最近的JavaScript版本还添加了Array.prototype.findLast(),可以用于查找最后一个匹配的键。

const findLastKey = (obj, fn) =>
  Object.keys(obj).findLast(key => fn(obj[key], key, obj));

findLastKey(
  {
    barney: { age: 36, active: true },
    fred: { age: 40, active: false },
    pebbles: { age: 1, active: true }
  },
  x => x['active']
); // 'pebbles'

对于旧版本的JavaScript,您需要使用Array.prototype.reverse()来反转键的顺序,然后使用Array.prototype.find()来查找最后一个匹配的键。

[!WARNING]

JavaScript对象的键没有顺序,也不能保证顺序与插入顺序相匹配。如果您需要依赖键的顺序,最好使用Map