2017-12-19 271 views
5

Istnieje już wiele cool features w ES6/ES7 do definiowania obiektów JavaScript. Jednak w kodzie JavaScript często występuje następujący wzór:Zwięzła/zwięzła składnia dla "opcjonalnych" kluczy obiektów w ES6/ES7?

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

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

Czy istnieje sposób na zdefiniowanie obiektu jednocześnie za pomocą przycisków opcjonalnych i wymaganych?

+0

Dlaczego po prostu nie używać trójskładnikowego? 'optionKey1: someCondition? value: undefined'? – Li357

+1

Czy na ES7 masz na myśli ES2016 lub funkcje eksperymentalne (propozycje)? Jeśli tak, użyj tagu [tag: ecmascript-next]. –

+0

@FelixKling Myślę, że jest to w dużej mierze teoretyczne rozróżnienie, ponieważ nie ma "całego" standardu ES6 lub ES7 zaimplementowanego w środowisku Węzeł/przeglądarka, a większość ludzi i tak korzysta z transpilera. –

Odpowiedz

5

Można użyć object spread mieć opcjonalną właściwość.

Uwaga: Object Rest/Spread to propozycja etapu 3 dla ECMAScript. Prawdopodobnie będziesz potrzebować babel transform, aby z niego skorzystać.

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

Aby wskazać optional klawisza można przypisać do niego null, jeśli warunek jest fałszywy

const someCondition = true; 
 

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

 
console.log(obj);

+0

Dobra odpowiedź, ale warto zauważyć, że w ten sposób 'optionalKey1' nadal pojawia się jako jeden z kluczy obiektu, jeśli warunek jest fałszywy (i ma wartość null), natomiast oryginalny fragment instrukcji OP stworzy obiekt, który nie ma klucza całkowicie, jeśli warunek jest fałszywy. – CRice

+0

Myślę, że przypisanie 'null' do właściwości jest bardziej zrozumiałe, że jest opcjonalne i nie ma wartości niż sprawdzanie istnienia –

0

następujący wzór jest powszechne w JavaScript

nie powinno. Posiadanie wielu obiektów o różnych kształtach może spowodować nałożenie kary. Rekordy powinny zawsze zawierać te same klucze. Po prostu użyj

const obj = { 
    requiredKey1: …, 
    requiredKey2: …, 
    optionalKey1: someCondition ? … : undefined, 
};