Je voudrais créer un objet avec un membre ajouté conditionnellement. L'approche simple est:
var a = {};
if (someCondition)
a.b = 5;
Maintenant, je voudrais écrire un code plus idiomatique. J'essaie:
a = {
b: (someCondition? 5 : undefined)
};
Mais maintenant, b
est un membre a
dont la valeur est undefined
. Ce n'est pas le résultat souhaité.
Existe-t-il une solution pratique?
Mise à jour
Je recherche une solution qui pourrait traiter le cas général avec plusieurs membres.
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
la source
la source
a.b
, la récupérationa.b
reviendrait deundefined
toute façon.in
opérateur est utilisé.Réponses:
En pur Javascript, je ne vois rien de plus idiomatique que votre premier extrait de code.
Si, cependant, l'utilisation de la bibliothèque jQuery n'est pas hors de question, alors $ .extend () devrait répondre à vos exigences car, comme le dit la documentation:
Par conséquent, vous pouvez écrire:
Et obtenez les résultats que vous attendez (si
conditionB
c'est le casfalse
, alorsb
ils n'existeront pasa
).la source
Je pense que @InspiredJW l'a fait avec ES5, et comme l'a souligné @trincot, utiliser es6 est une meilleure approche. Mais nous pouvons ajouter un peu plus de sucre, en utilisant l'opérateur d'étalement, et une évaluation logique ET en court-circuit:
la source
Null/Undefined Are Ignored
, il ne dit pasfalse
est ignoré. Les transpileurs peuvent autoriser cela à l'heure actuelle, mais est-ce conforme? Ce qui suit devrait être{...someCondition ? {b: 5} : null}
mais n'est pas aussi compact.Object.assign
et a une priorité plus faible que l'opérateur &&. Il ignore la valeur sans propriété (booléen, null, non défini, nombre) et ajoute toutes les propriétés de l'objet après la mise...
en place. rappelez-vous que l'&&
opérateur retourne la bonne valeur si vrai, ou faux sinon. donc sisomeCondition
est vrai,{b : 5}
sera passé à l'...
opérateur, ce qui entraînera l'ajout de la propriétéb
àa
avec valeur5
. issomeCondition
est false,false
sera transmis à l'...
opérateur. résultant en rien ajouté. c'est intelligent. J'aime cela.Avec EcmaScript2015, vous pouvez utiliser
Object.assign
:Afficher l'extrait de code
Quelques remarques:
Object.assign
modifie le premier argument sur place, mais il renvoie également l'objet mis à jour: vous pouvez donc utiliser cette méthode dans une expression plus grande qui manipule davantage l'objet.null
vous pourriez passerundefined
ou{}
, avec le même résultat. Vous pouvez même fournir à la0
place, car les valeurs primitives sont encapsulées etNumber
n'ont pas de propriétés énumérables propres .Encore plus concis
En prenant le deuxième point plus loin, vous pouvez le raccourcir comme suit (comme @Jamie a en pointe), en tant que valeurs falsy ont pas propres propriétés dénombrables (
false
,0
,NaN
,null
,undefined
,''
, à l' exceptiondocument.all
):Afficher l'extrait de code
la source
Démo en direct:
la source
L'utilisation de la syntaxe étendue avec booléen (comme suggéré ici) n'est pas une syntaxe valide. La propagation ne peut être utilisée qu'avec des itérables .
Je suggère ce qui suit:
la source
{...false}
{...false}
est une syntaxe valide.CopyDataProperties
la valeur est exécutée (false
dans ce cas). Cela implique la mise en boîte d'une primitive (sections 7.3.23, 7.1.13). Le lien que vous avez vers MDN mentionne cette "exception" entre parenthèses.Qu'en est-il de l'utilisation des propriétés d'objet améliorées et ne définissez la propriété que si elle est vraie, par exemple:
Donc, si la condition n'est pas remplie, elle ne crée pas la propriété préférée et vous pouvez donc la supprimer. Voir: http://es6-features.org/#ComputedPropertyNames
MISE À JOUR: Il est encore mieux de suivre l'approche d'Axel Rauschmayer dans son article de blog sur l'ajout conditionnel d'entrées à l'intérieur des littéraux et des tableaux d'objets ( http://2ality.com/2017/04/conditional-literal-entries.html ):
Cela m'a beaucoup aidé.
la source
false
clé supplémentaire . Par exemple,{[true && 'a']: 17, [false && 'b']: 42}
est{a:17, false: 42}
...isConditionTrue() && { propertyName: 'propertyValue' }
plus simplifié,
la source
Si l'objectif est de faire en sorte que l'objet apparaisse autonome et se trouve dans un ensemble d'accolades, vous pouvez essayer ceci:
la source
Si vous souhaitez faire cela côté serveur (sans jquery), vous pouvez utiliser lodash 4.3.0:
Et cela fonctionne en utilisant lodash 3.10.1
la source
J'espère que c'est le moyen le plus efficace d'ajouter une entrée en fonction de la condition. Pour plus d'informations sur l'ajout conditionnel d'entrées à l'intérieur d'un littéral d'objet.
la source
[...condition?'':['item']]
cela ajoutera un élément de chaîne dans le tableauCela a longtemps été répondu, mais en regardant d'autres idées, j'ai trouvé un dérivé intéressant:
Attribuez des valeurs non définies à la même propriété et supprimez-la ensuite
Créez votre objet à l'aide d'un constructeur anonyme et affectez toujours des membres non définis au même membre factice que vous supprimez à la toute fin. Cela vous donnera une seule ligne (pas trop complexe j'espère) par membre + 1 ligne supplémentaire à la fin.
la source
Vous pouvez ajouter toutes vos valeurs indéfinies sans condition, puis utiliser
JSON.stringify
pour les supprimer toutes:la source
Je ferais ça
Modifié avec une version de code de ligne
la source
a = undefined
. Il peut être facilement modifié avecreturn { b: undefined };
: /return {};
enelse
partiea = condition ? {b:5} : undefined;
En utilisant la bibliothèque lodash, vous pouvez utiliser _.omitBy
Cela est pratique lorsque vous avez des demandes facultatives
la source
Je pense que votre première approche pour ajouter des membres conditionnellement est parfaitement bien. Je ne suis pas d' accord avec ne pas vouloir d'avoir un membre
b
dea
une valeur deundefined
. C'est assez simple pour ajouter uneundefined
vérification avec l'utilisation d'unefor
boucle avec l'in
opérateur. Mais de toute façon, vous pouvez facilement écrire une fonction pour filtrer lesundefined
membres.Vous pouvez également utiliser l'
delete
opérateur pour modifier l'objet en place.la source
Envelopper dans un objet
Quelque chose comme ça est un peu plus propre
Envelopper dans un tableau
Ou si vous souhaitez utiliser la méthode de Jamie Hill et avoir une très longue liste de conditions, vous devez écrire la
...
syntaxe plusieurs fois. Pour le rendre un peu plus propre, vous pouvez simplement les envelopper dans un tableau, puis les utiliserreduce()
pour les renvoyer comme un seul objet.Ou en utilisant la
map()
fonctionla source
C'est la solution la plus succincte que je puisse trouver:
la source
Définissez un var par
let
et attribuez simplement une nouvelle propriétéMaintenant, le
msg
devenirÀ mon avis, c'est une solution très simple et facile.
la source
En utilisant la bibliothèque lodash, vous pouvez utiliser _.merge
false
& conditionC esttrue
, alorsa = { c: 5 }
true
, alorsa = { b: 4, c: 5 }
false
, alorsa = {}
la source
lodash@^4.0.0
.undefined
sont inclus dans mon cas.