2017-12-19 123 views
5

Đã có rất nhiều cool features trong ES6/ES7 để xác định đối tượng Javascript. Tuy nhiên, mẫu sau phổ biến trong Javascript:Cú pháp ngắn gọn/súc tích cho các khóa đối tượng 'tùy chọn' trong ES6/ES7?

const obj = { 
    requiredKey1: ..., 
    requiredKey2: ... 
}; 

if (someCondition) { 
    obj.optionalKey1 = ...; 
} 

Có cách nào để xác định đối tượng cùng một lúc với cả khóa tùy chọn và bắt buộc không?

+0

Tại sao không chỉ sử dụng bộ ba? 'optionKey1: someCondition? giá trị: undefined'? – Li357

+1

Với ES7 bạn có thực sự có nghĩa là ES2016 hoặc các tính năng thử nghiệm (đề xuất)? Nếu có, vui lòng sử dụng thẻ [tag: ecmascript-next]. –

+0

@ FelixKling Tôi nghĩ rằng đó là một sự phân biệt lý thuyết phần lớn bởi vì không có một 'toàn bộ' ES6 hoặc ES7 tiêu chuẩn thực hiện trong môi trường Node/trình duyệt và hầu hết mọi người đang sử dụng transpilers anyway. –

Trả lời

5

Bạn có thể sử dụng object spread để có một tài sản không bắt buộc.

Lưu ý: Đối tượng Rest/Spread là đề xuất giai đoạn 3 cho ECMAScript. Có thể bạn sẽ cần babel transform để sử dụng.

let flag1 = true; 
 
let flag2 = false; 
 

 
const obj = { 
 
    requiredKey1: 1, 
 
    requiredKey2: 2, 
 
    ...(flag1 && { optionalKey1: 5 }), 
 
    ...(flag2 && { optionalKey2: 6, optionalKey2: 7 }), 
 
    ...(flag1 && { optionalKey4: 8, optionalKey5: 9 }) 
 
}; 
 

 
console.log(obj);

4

Để chỉ ra optional quan trọng, bạn có thể gán cho nó null, nếu điều kiện là sai

const someCondition = true; 
 

 
const obj = { 
 
    requiredKey1: 1, 
 
    requiredKey2: 2, 
 
    optionalKey1: someCondition ? 'optional' : null 
 
}; 
 

 
console.log(obj);

+0

Câu trả lời hay, nhưng đáng chú ý rằng bằng cách làm điều này, 'optionalKey1' vẫn xuất hiện như một trong các khóa của đối tượng nếu điều kiện là false (và có giá trị null), trong khi đoạn mã OPS ban đầu sẽ tạo một đối tượng thiếu khóa hoàn toàn nếu điều kiện là sai. – CRice

+0

Tôi nghĩ rằng, gán 'null' cho thuộc tính dễ hiểu hơn là nó là tùy chọn và không có giá trị hơn là kiểm tra sự tồn tại –

0

mẫu sau là phổ biến trong javascript

Nó không nên. Có nhiều đối tượng có hình dạng khác nhau có thể phải chịu một hình phạt về hiệu suất. Các bản ghi phải luôn chứa cùng một khóa. Vì vậy, chỉ cần sử dụng

const obj = { 
    requiredKey1: …, 
    requiredKey2: …, 
    optionalKey1: someCondition ? … : undefined, 
}; 
Các vấn đề liên quan