在 TypeScript 中按值获取对象的键
要在 TypeScript 中按值获取对象的键:
- 使用
Object.keys()
方法获取对象键的数组。 - 键入数组作为对象键的数组。
- 使用
find()
方法通过值获取键。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
// ✅ Using Object.keys()
const result1 = (Object.keys(obj) as (keyof typeof obj)[]).find((key) => {
return obj[key] === 'accounting';
});
console.log(result1); // ?️ "department"
// ✅ Using Object.entries()
let result2 = '';
Object.entries(obj).find(([key, value]) => {
if (value === 'accounting') {
result2 = key;
return true;
}
return false;
});
console.log(result2); // ?️ "department"
代码片段中的两个示例都按值获取对象的键。
我们在第一个示例中使用了 Object.keys
方法。 该方法返回对象键的数组。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
// 👇️ const r: string[]
const r = Object.keys(obj);
console.log(r); // 👉️ ['name', 'department', 'country']
但是,请注意 TypeScript 将
Object.keys()
方法的返回值类型为string[]
。
对象的所有键都是字符串,但并非所有字符串都是对象中的键,因此我们无法直接通过键访问值。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
// 👇️ const r: string[]
const r = Object.keys(obj).find((key) => {
// ⛔️ Error: No index signature with a parameter of
// type 'string' was found on type
// '{ name: string; department: string; country: string; }'.
return obj[key] === 'accounting';
});
TypeScript 告诉我们不能用任何字符串键索引对象,它必须是 name 、department 或 country。
这就是我们使用类型断言来键入 Object.keys()
方法的返回值的原因。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
// now the `key` parameter is typed as
// 👇️ (parameter) key: "name" | "department" | "country"
const result1 = (Object.keys(obj) as (keyof typeof obj)[]).find((key) => {
return obj[key] === 'accounting';
});
console.log(result1); // 👉️ "department"
现在 find
方法中的 key 参数是对象键的联合类型,所以一切都按预期工作。
我们传递给 Array.find
方法的函数被键数组中的每个元素调用,直到它返回一个真值或遍历整个数组。
如果满足条件,则
find()
方法返回相应的数组元素并短路。
如果条件永远不满足,find()
返回 undefined 。
我们还可以使用 Object.entries()
方法通过值获取对象的键。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
let result2 = '';
Object.entries(obj).find(([key, value]) => {
if (value === 'accounting') {
result2 = key;
return true;
}
return false;
});
console.log(result2); // 👉️ "department"
请注意
,在使用这种方法时,我们不必使用类型断言。
Object.entries()
方法返回一个键值对数组。
const obj = {
name: 'Tom',
department: 'accounting',
country: 'Chile',
};
// 👇️ const r: [string, string][]
const r = Object.entries(obj);
// 👇️ [['name', 'Tom'], ['department', 'accounting'], ['country', 'Chile']]
console.log(r);
这很有用,因为我们不必使用类型断言,因为我们得到了一个由 2 个元素组成的数组 – 键和值。
find()
方法返回满足条件的数组元素或未定义的值,我们只需要键,因此更简单:
- 在方法之外初始化一个变量
- 满足条件后设置其值
- 短路
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。