1 Câu hỏi: Giá trị trả về Enum Object.values ​​()

câu hỏi được tạo ra tại Wed, May 8, 2019 12:00 AM

Tại sao Object.values()Object.keys() luôn cung cấp cả khóa và giá trị?

Hãy xem xét mã sau đây:

enum Enum {
    FOO,
    BAR
}

console.log(Object.values(Enum));
console.log(Object.keys(Enum));

Đầu ra của cái này sẽ là:

[ 'FOO', 'BAR', 0, 1 ]
[ '0', '1', 'FOO', 'BAR' ]

Tại sao nó làm điều đó và làm cách nào tôi chỉ nhận được các khóa và giá trị?

    
0
  1. Thông tin thêm về enums: stackoverflow.com/questions/28818849/trên . Cách nhận khóa /giá trị: github.com/Microsoft/TypeScript/issues/,
    2019-05-08 16: 27: 35Z
1 Câu trả lời                              1                         

Đó là cách các loại enum được dịch mã bởi TypeScript.

enum Enum {
    FOO,
    BAR
}

sẽ trở thành

"use strict";
var Enum;
(function (Enum) {
    Enum[Enum["FOO"] = 0] = "FOO";
    Enum[Enum["BAR"] = 1] = "BAR";
})(Enum || (Enum = {}));

Lưu ý rằng cả khóa số và khóa chuỗi đều được cung cấp để dễ dàng ánh xạ đến và từ cả hai loại, cho phép bạn làm điều gì đó như thế này:

const value = Enum.FOO;  // inferred type Enum.FOO
const key = Enum[value]; // inferred type string

Nếu bạn muốn nhận một mảng chỉ các phím số hoặc chuỗi, bạn có thể làm điều này:

const numericKeys = Object.keys(Enum).map(x => parseInt(x)).filter(x => !isNaN(x));
const stringKeys = Object.keys(Enum).filter(x => isNaN(parseInt(x)));

Hoặc đối với các giá trị số hoặc chuỗi (yêu cầu thư viện es2017 trong tsconfig của bạn):

const numericValues = Object.values(Enum).filter(x => typeof x === "number");
const stringValues = Object.values(Enum).filter(x => typeof x === "string");
    
3
2019-05-08 16: 26: 41Z
  1. Được rồi, cảm ơn bạn rất nhiều. Có cách nào để chỉ nhận được các giá trị sau đó? Tôi cho rằng có thể có được kết quả đó bằng cách sử dụng Array.splice () nhưng tôi không chắc liệu thứ tự có luôn giống nhau hay không (mặc dù có vẻ như vậy).
    2019-05-08 16: 14: 16Z
  2. const values = Object.values(Enum).filter(v => typeof v === 'number');
    2019-05-08 16: 15: 45Z
  3. @ Lehks Xem câu trả lời được cập nhật của tôi.
    2019-05-08 16: 21: 04Z
nguồn đặt đây