在 TypeScript 中按值获取对象的键

在 TypeScript 中按值获取对象的键

Get an Object’s Key by Value in TypeScript

在 TypeScript 中按值获取对象的键:

  1. 使用该Object.keys()方法获取对象键的数组。
  2. 键入数组作为对象键的数组。
  3. 使用该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,departmentcountry

这就是我们使用
类型断言
来确定方法返回值类型的原因
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值,我们只需要键,因此更简单:

  1. 在方法外初始化一个变量
  2. 满足条件后设置其值
  3. 短路

发表评论