在 TypeScript 中按值获取对象的键
Get an Object’s Key by Value in TypeScript
在 TypeScript 中按值获取对象的键:
- 使用该
Object.keys()
方法获取对象键的数组。 - 键入数组作为对象键的数组。
- 使用该
find()
方法通过值获取键。
索引.ts
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方法。该方法返回对象键的数组。
索引.ts
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[]
对象的所有键都是字符串,但并非所有字符串都是对象中的键,因此我们无法直接通过键访问值。
索引.ts
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()
。
索引.ts
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"
现在方法中
的key
参数是对象键的联合类型
,所以一切都按预期工作。find
我们传递给
Array.find
方法的函数会针对键数组中的每个元素进行调用,直到它返回真值或遍历整个数组。
如果满足条件,则该
find()
方法返回相应的数组元素并短路。如果永远不满足条件,则find()
返回undefined
。
您还可以使用该Object.entries()
方法通过对象的值获取对象的键。
索引.ts
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
方法返回一个键值对数组。
索引.ts
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()
方法返回满足条件的数组元素或一个undefined
值,我们只需要键,因此更简单:
- 在方法外初始化一个变量
- 满足条件后设置其值
- 短路