在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
。