Ich möchte ein Objekt mit einem bedingt hinzugefügten Mitglied erstellen. Der einfache Ansatz ist:
var a = {};
if (someCondition)
a.b = 5;
Jetzt möchte ich einen idiomatischeren Code schreiben. Ich versuche:
a = {
b: (someCondition? 5 : undefined)
};
Aber jetzt b
ist ein Mitglied, a
dessen Wert ist undefined
. Dies ist nicht das gewünschte Ergebnis.
Gibt es eine praktische Lösung?
Aktualisieren
Ich suche nach einer Lösung, die den allgemeinen Fall mit mehreren Mitgliedern behandeln kann.
a = {
b: (conditionB? 5 : undefined),
c: (conditionC? 5 : undefined),
d: (conditionD? 5 : undefined),
e: (conditionE? 5 : undefined),
f: (conditionF? 5 : undefined),
g: (conditionG? 5 : undefined),
};
javascript
viebel
quelle
quelle
a.b
,a.b
würde das Abrufen trotzdem zurückkehrenundefined
.in
Operator verwendet wird.Antworten:
In reinem Javascript kann ich mir nichts Idiomatischeres vorstellen als Ihr erstes Code-Snippet.
Wenn die Verwendung der jQuery-Bibliothek jedoch nicht ausgeschlossen ist, sollte $ .extend () Ihren Anforderungen entsprechen, da in der Dokumentation Folgendes angegeben ist :
Daher können Sie schreiben:
Und erhalten Sie die Ergebnisse, die Sie erwarten (wenn
conditionB
jafalse
, dannb
wird es in nicht existierena
).quelle
Ich denke, @InspiredJW hat es mit ES5 gemacht, und wie @trincot betonte, ist die Verwendung von es6 ein besserer Ansatz. Mit dem Spread-Operator und der logischen UND-Kurzschlussbewertung können wir jedoch etwas mehr Zucker hinzufügen:
quelle
Null/Undefined Are Ignored
, es heißt nicht, dassfalse
es ignoriert wird. Transpiler können dies derzeit zulassen, aber ist es konform? Das Folgende sollte sein{...someCondition ? {b: 5} : null}
, ist aber nicht so kompakt.Object.assign
und hat eine geringere Priorität als der && -Operator. Der Wert ohne Eigenschaft (boolean, null, undefined, number) wird ignoriert und alle Eigenschaften des Objekts nach dem...
In-Place hinzugefügt . Denken Sie daran, dass der&&
Operator den richtigen Wert zurückgibt, wenn er wahr ist, oder andernfalls falsch. also , wennsomeCondition
wahr ist,{b : 5}
wird an den weitergegeben wird...
Operator, was das Hinzufügen der Eigenschaftb
zua
mit Wert5
. istsomeCondition
falsch,false
wird an den...
Bediener übergeben. was zu nichts hinzugefügt. es ist klug. Ich liebe es.Mit EcmaScript2015 können Sie Folgendes verwenden
Object.assign
:Code-Snippet anzeigen
Einige Anmerkungen:
Object.assign
Ändert das erste Argument direkt, gibt aber auch das aktualisierte Objekt zurück. Sie können diese Methode also in einem größeren Ausdruck verwenden, der das Objekt weiter manipuliert.null
könnten Sieundefined
oder{}
mit dem gleichen Ergebnis bestehen. Sie können0
stattdessen sogar angeben , da primitive Werte umbrochen werden undNumber
keine eigenen aufzählbaren Eigenschaften haben .Noch prägnanter
Unter dem zweiten Punkt weiter, könnte man es verkürzt wie folgt (wie @Jamie bemerkt hat), als falsy Werte keine eigenen enumerable Eigenschaften (
false
,0
,NaN
,null
,undefined
,''
, mit Ausnahmedocument.all
):Code-Snippet anzeigen
quelle
Live-Demo:
quelle
Die Verwendung der Spread-Syntax mit Booleschen Werten (wie hier vorgeschlagen) ist keine gültige Syntax. Spread kann nur mit iterables verwendet werden .
Ich schlage folgendes vor:
quelle
{...false}
{...false}
ist eine gültige Syntax.CopyDataProperties
der Wert (false
in diesem Fall) ausgeführt wird. Dies beinhaltet das Boxen eines Grundelements (Abschnitte 7.3.23, 7.1.13). Der Link, den Sie zu MDN haben, erwähnt diese "Ausnahme" in Klammern.Wie wäre es mit der Verwendung erweiterter Objekteigenschaften und der Festlegung der Eigenschaft nur, wenn sie wahr ist, z.
Wenn die Bedingung nicht erfüllt ist, wird die bevorzugte Eigenschaft nicht erstellt, und Sie können sie verwerfen. Siehe: http://es6-features.org/#ComputedPropertyNames
UPDATE: Es ist noch besser, dem Ansatz von Axel Rauschmayer in seinem Blog-Artikel über das bedingte Hinzufügen von Einträgen in Objektliteralen und Arrays zu folgen ( http://2ality.com/2017/04/conditional-literal-entries.html ):
Hat mir sehr geholfen.
quelle
false
Schlüssel hinzugefügt wird . Zum Beispiel{[true && 'a']: 17, [false && 'b']: 42}
ist{a:17, false: 42}
...isConditionTrue() && { propertyName: 'propertyValue' }
vereinfacht,
quelle
Wenn das Ziel darin besteht, dass das Objekt in sich geschlossen erscheint und sich in einer Reihe von Klammern befindet, können Sie Folgendes versuchen:
quelle
Wenn Sie diese Serverseite (ohne JQuery) ausführen möchten, können Sie lodash 4.3.0 verwenden:
Und das funktioniert mit lodash 3.10.1
quelle
Ich hoffe, dies ist der viel effizientere Weg, um einen Eintrag basierend auf der Bedingung hinzuzufügen. Weitere Informationen zum bedingten Hinzufügen von Einträgen in Objektliteralen.
quelle
[...condition?'':['item']]
Dies wird String-Element in Array hinzufügenDies wurde lange beantwortet, aber als ich mir andere Ideen ansah, kam ich auf eine interessante Ableitung:
Weisen Sie derselben Eigenschaft undefinierte Werte zu und löschen Sie sie anschließend
Erstellen Sie Ihr Objekt mit einem anonymen Konstruktor und weisen Sie immer undefinierte Elemente demselben Dummy- Element zu, das Sie ganz am Ende entfernen. Dies gibt Ihnen eine einzelne Zeile (hoffentlich nicht zu komplex) pro Mitglied + 1 zusätzliche Zeile am Ende.
quelle
Sie können alle Ihre undefinierten Werte ohne Bedingung hinzufügen und dann verwenden
JSON.stringify
, um sie alle zu entfernen:quelle
Ich würde das tun
Mit einer Zeilencode-Version bearbeitet
quelle
a = undefined
. Es kann leicht geändert werden mitreturn { b: undefined };
: /return {};
inelse
Teila = condition ? {b:5} : undefined;
Mit der lodash-Bibliothek können Sie _.omitBy verwenden
Dies ist praktisch, wenn Sie optionale Anforderungen haben
quelle
Ich denke, Ihr erster Ansatz, Mitglieder bedingt hinzuzufügen, ist vollkommen in Ordnung. Ich stimme nicht wirklich mit nicht Mitglied haben will ,
b
dera
mit einem Wert vonundefined
. Es ist einfach genug, mit dem Operator eineundefined
Prüfung unter Verwendung einerfor
Schleife hinzuzufügenin
. Auf jeden Fall können Sie leicht eine Funktion schreiben, umundefined
Mitglieder herauszufiltern .Sie können den
delete
Operator auch verwenden , um das Objekt an Ort und Stelle zu bearbeiten.quelle
In ein Objekt einwickeln
So etwas ist ein bisschen sauberer
In ein Array einwickeln
Oder wenn Sie die Methode von Jamie Hill verwenden möchten und eine sehr lange Liste von Bedingungen haben, müssen Sie die
...
Syntax mehrmals schreiben . Um es ein bisschen sauberer zu machen, können Sie sie einfach in ein Array einbinden und dannreduce()
als einzelnes Objekt zurückgeben.Oder mit
map()
Funktionquelle
Dies ist die prägnanteste Lösung, die ich finden kann:
quelle
Mit der lodash-Bibliothek können Sie _.merge verwenden
false
& BedingungC isttrue
, danna = { c: 5 }
true
, danna = { b: 4, c: 5 }
false
, danna = {}
quelle
lodash@^4.0.0
.undefined
werden in meinem Fall aufgenommen.