Prägnante/prägnante Syntax für ‘optionale’ Objektschlüssel in ES6/ES7?

Lesezeit: 4 Minuten

Benutzer-Avatar
Andreas Mao

Es gibt schon viele coole Funktionen in ES6/ES7 zum Definieren von Javascript-Objekten. Das folgende Muster ist jedoch in Javascript üblich:

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

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

Gibt es eine Möglichkeit, das Objekt gleichzeitig mit optionalen und erforderlichen Schlüsseln zu definieren?

  • Warum nicht einfach einen Dreier verwenden? optionKey1: someCondition ? value : undefined?

    – Andreas Li

    19. Dezember 2017 um 17:21 Uhr

  • @FelixKling Ich denke, das ist eine weitgehend theoretische Unterscheidung, da in Knoten- / Browserumgebungen kein “vollständiger” ES6- oder ES7-Standard implementiert ist und die meisten Benutzer sowieso Transpiler verwenden.

    – Andreas Mao

    20. Dezember 2017 um 18:49 Uhr

  • Nun, es definiert den Spielraum für Antworten. Wir wissen nicht, was Sie verwenden. Außerdem möchte ich nicht, dass die Leute den Begriff ES7 für experimentelle Funktionen missbrauchen.

    – Felix Klinge

    20. Dezember 2017 um 18:53 Uhr

  • @FelixKling Ich frage nach jedem Standard von Ecmascript; Offensichtlich sind vorhandene unterstützte Standards besser. Wenn dies mit experimentellen Funktionen möglich ist, okay. Wenn es mit ES6 oder ES7 geht, besser. Wenn es mit ES5 möglich ist, super!

    – Andreas Mao

    20. Dezember 2017 um 18:55 Uhr

  • Ich würde gerne sowas sehen { key?: optionalValue } oder mit Eigenschaftskürzel: { optionalValue? }

    – cimak

    14. November 2020 um 23:31 Uhr


Benutzer-Avatar
Ori Drori

Sie können verwenden Objekt verbreitet um eine optionale Eigenschaft zu haben:

let flag1 = true;
let flag2 = false;

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

console.log(obj);

  • Hinweis: Dadurch werden alle Getter in statische Werte umgewandelt.

    – Ryan König

    25. Februar 2020 um 22:36 Uhr

  • Als Hinweis, Sie brauchen die Klammern nicht. z.B. ...flag1 && { optionalKey1: 5 }, ist auch in Ordnung.

    – MattCochrane

    8. Juni 2020 um 11:25 Uhr

  • @RyanKing kannst du eine Probe geben? {get x() {return this.a + this.b}, b: 2, ...a && {a}} funktioniert wie erwartet

    – Zum Beispiel’

    9. April 2021 um 10:38 Uhr

  • @RyanKing ah, optionaler Getter;) o’c du kannst Getter nicht zerstören;)

    – Zum Beispiel’

    13. April 2021 um 12:05 Uhr

  • Ich erhalte einen Fehler im falschen Wert, den ich damit gelöst habe: …(flag2 && { optionalKey2: 6, optionalKey3: 7 }) as {},

    – Juanjinario

    21. Juli 2021 um 8:24 Uhr

Um anzuzeigen optional Schlüssel können Sie ihm zuweisen nullwenn die Bedingung falsch ist

const someCondition = true;

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

console.log(obj);

  • Gute Antwort, aber es ist erwähnenswert, dass dadurch optionalKey1 erscheint immer noch als einer der Schlüssel des Objekts, wenn die Bedingung falsch ist (und den Wert null hat), wohingegen das ursprüngliche Snippet von OP ein Objekt erstellt, dem der Schlüssel vollständig fehlt, wenn die Bedingung falsch ist.

    – CRice

    19. Dezember 2017 um 17:32 Uhr


  • Ich denke, zuordnen null der Eigenschaft ist verständlicher, dass sie optional ist und keinen Wert hat, als auf Existenz zu prüfen

    – Suren Srapjan

    19. Dezember 2017 um 17:53 Uhr

  • Ich persönlich möchte eine Art Fehler erhalten, und im Allgemeinen würde mir eine Sprache (und insbesondere JavaScript) das Verhalten geben, wenn ich versuche, auf eine nicht vorhandene Eigenschaft zuzugreifen, anstatt sie nullfähig zu machen, da sie es ist niemals einen Wert haben wird, im Gegensatz zu dem, wofür Nullable-Werte verwendet werden – es muss existieren, es existiert. Wenn es nicht beendet werden muss, muss es nicht – ich denke, das macht mehr Sinn.

    – Gal Grünfeld

    1. Dezember 2020 um 18:39 Uhr

  • @SurenSrapyan fügt eine hinzu Optional Mitglied mit null Wert macht es nicht optional. Es bedeutet, dass das Objekt eine hat tatsächlich Mitglied, dessen zugewiesener Wert ist null was eigentlich ist ein Wert. Das magst du denken null ist kein Wert, aber es ist. Daher wird ein Mitglied dadurch nicht optional. Ein optionales Mitglied wäre eines, das nicht von zurückgegeben würde Object.entries(obj) Funktion. Wenn Sie ihm zumindest einen Wert zuweisen würden undefined was bedeuten würde, dass das Mitglied ist nicht definiert und ihm ist kein Wert zugeordnet. Object.entries(obj) würde das Mitglied trotzdem sehen.

    – Robert Koritnik

    8. August um 14:20 Uhr


Das folgende Muster ist in Javascript üblich

Es sollte nicht. Viele Objekte mit unterschiedlichen Formen zu haben, kann zu Leistungseinbußen führen. Datensätze sollten immer die gleichen Schlüssel enthalten. Also einfach benutzen

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

  • Das Muster ist wirklich nützlich bei Objekten, die Sie als Optionen übergeben.

    – krulik

    10. Dezember 2019 um 10:24 Uhr

  • @krulik Optionsobjektparameter können normalerweise ganz gut damit umgehen undefined Eigenschaften, ohne sie von nicht existierenden Eigenschaften zu unterscheiden.

    – Bergi

    10. Dezember 2019 um 11:56 Uhr

1175760cookie-checkPrägnante/prägnante Syntax für ‘optionale’ Objektschlüssel in ES6/ES7?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy