Voici mon objet littéral:
var obj = {key1: value1, key2: value2};
Comment puis-je ajouter un champ key3
avec value3
à l'objet?
javascript
object-literal
James Skidmore
la source
la source
Réponses:
Il existe deux façons d'ajouter de nouvelles propriétés à un objet:
Utilisation de la notation par points:
Utilisation de la notation entre crochets:
Le premier formulaire est utilisé lorsque vous connaissez le nom de la propriété. Le deuxième formulaire est utilisé lorsque le nom de la propriété est déterminé dynamiquement. Comme dans cet exemple:
Un vrai tableau JavaScript peut être construit en utilisant soit:
La notation littérale du tableau:
La notation constructeur Array:
la source
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
length
propriété n'est pas définie car ce n'est pas un tableau, c'est un objet / carte / dictionnaire.Réponse de l'année 2017:
Object.assign()
Object.assign (dest, src1, src2, ...) fusionne les objets.
Il écrase les
dest
propriétés et les valeurs des objets source (aussi nombreux soient-ils), puis revientdest
.Exemple en direct
Réponse de l'année 2018: opérateur de propagation d'objets
{...}
De MDN :
Exemple en direct
Il fonctionne dans Chrome actuel et Firefox actuel. Ils disent que cela ne fonctionne pas dans Edge actuel.
Réponse de l'année 2019
Opérateur d'affectation d'objets+=
:Oups ... je me suis emporté. La contrebande d'informations provenant du futur est illégale. Dûment obscurci!la source
const
etlet
au lieu devar
, cela devrait-il être la manière 2018?const
parce que cela supprime cet avantage. Chaque fois que je l'ai utilisé, cela a entravé le développement.Year 2019 answer ... Opps ...
portion mérite un merci, vous avez fait ma journée . Meilleure réponse +1J'ai adoré le LoDash / Underscore lors de l'écriture de projets plus importants.
L'ajout par
obj['key']
ouobj.key
sont toutes des réponses JavaScript pures et solides. Cependant, les bibliothèques LoDash et Underscore fournissent de nombreuses fonctions supplémentaires pratiques lorsque vous travaillez avec des objets et des tableaux en général..push()
est pour les tableaux , pas pour les objets .Selon ce que vous recherchez, il existe deux fonctions spécifiques qui peuvent être agréables à utiliser et offrent des fonctionnalités similaires à la sensation de
arr.push()
. Pour plus d'informations, consultez les documents, ils contiennent de bons exemples._.merge (Lodash uniquement)
Le deuxième objet remplacera ou ajoutera à l'objet de base.
undefined
les valeurs ne sont pas copiées._.extend / _.assign
Le deuxième objet remplacera ou ajoutera à l'objet de base.
undefined
sera copié._.defaults
Le deuxième objet contient des valeurs par défaut qui seront ajoutées à l'objet de base si elles n'existent pas.
undefined
les valeurs seront copiées si la clé existe déjà.$ .extend
De plus, il peut être utile de mentionner jQuery.extend, il fonctionne de manière similaire à _.merge et peut être une meilleure option si vous utilisez déjà jQuery.
Le deuxième objet remplacera ou ajoutera à l'objet de base.
undefined
les valeurs ne sont pas copiées.Object.assign ()
Il peut être utile de mentionner le Object.assign ES6 / ES2015, il fonctionne de manière similaire à _.merge et peut être la meilleure option si vous utilisez déjà un polyfill ES6 / ES2015 comme Babel si vous souhaitez effectuer vous- même le polyfill .
Le deuxième objet remplacera ou ajoutera à l'objet de base.
undefined
sera copié.la source
_.extend
c'est un alias plus universel puisque la bibliothèque de soulignement n'utilise toujoursextend
pasmerge
. Je mettrai à jour ma réponse.Vous pouvez utiliser l'une de ces options (à condition que key3 soit la clé réelle que vous souhaitez utiliser)
ou
Si key3 est une variable, vous devez alors faire:
Après cela, la requête
arr.a_key
retournerait la valeur devalue3
, un littéral3
.la source
parce que votre arr n'est pas vraiment un tableau ... C'est un objet prototype. Le vrai tableau serait:
mais ce n'est toujours pas bien. Il devrait en fait être:
la source
la source
Ajouter simplement des propriétés:
Et nous voulons ajouter
prop2 : 2
à cet objet, ce sont les options les plus pratiques:object.prop2 = 2;
object['prop2'] = 2;
Alors, lequel utilisons-nous alors?
L'opérateur point est une syntaxe plus propre et doit être utilisé par défaut (imo). Cependant, l'opérateur point n'est pas capable d'ajouter des clés dynamiques à un objet, ce qui peut être très utile dans certains cas. Voici un exemple:
Fusion d'objets:
Lorsque nous voulons fusionner les propriétés de 2 objets, ce sont les options les plus pratiques:
Object.assign()
, prend un objet cible comme argument et un ou plusieurs objets source et les fusionnera. Par exemple:...
Lequel utilisons-nous?
Object.assign()
est plus dynamique car nous avons accès à tous les objets qui sont passés comme arguments et pouvons les manipuler avant qu'ils ne soient affectés au nouvel objet.la source
Performance
Aujourd'hui 2020.01.14 j'effectue des tests sur MacOs HighSierra 10.13.6 sur Chrome v78.0.0, Safari v13.0.4 et Firefox v71.0.0, pour les solutions choisies. Je divise les solutions en mutable (première lettre M) et immuable (première lettre I). Je propose également quelques solutions immuables (IB, IC, ID / IE) non encore publiées dans les réponses à cette question
Conclusions
obj.key3 = "abc"
(MA, MB) est la plus rapide{...obj, key3:'abc'}
etObject.assign
(IA, IB) sont les plus rapidesDétails
Dans l'extrait ci-dessous, il y a une solution testée présumée, vous pouvez pré-tester sur votre machine ICI
Afficher l'extrait de code
la source
Je sais qu'il y a déjà une réponse acceptée pour cela, mais j'ai pensé documenter mon idée quelque part. S'il vous plaît [les gens] n'hésitez pas à percer cette idée, car je ne suis pas sûr que ce soit la meilleure solution ... mais je viens de mettre cela ensemble il y a quelques minutes:
Vous l'utiliseriez de cette manière:
Depuis, la fonction prototype revient,
this
vous pouvez continuer à enchaîner.push
à la fin de votreobj
variable:obj.push(...).push(...).push(...);
Une autre caractéristique est que vous pouvez passer un tableau ou un autre objet comme valeur dans les arguments de la fonction push. Voir mon violon pour un exemple de travail: http://jsfiddle.net/7tEme/
la source
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
ce qui est bizarre car cela fonctionne dans jsfiddle même avec jquery1.9Vous pouvez créer une classe avec la réponse de @ Ionuț G. Stan
Création d'un nouvel objet avec la dernière classe:
Impression de l'objet
Impression d'une clé
Je suis novice en javascript, les commentaires sont les bienvenus. Travaille pour moi.
la source
Deux façons les plus utilisées déjà mentionnées dans la plupart des réponses
Une autre façon de définir une propriété consiste à utiliser Object.defineProperty ()
Cette méthode est utile lorsque vous souhaitez avoir plus de contrôle lors de la définition d'une propriété. La propriété définie peut être définie comme énumérable, configurable et accessible en écriture par l'utilisateur.
la source
Votre exemple montre un objet, pas un tableau. Dans ce cas, la meilleure façon d'ajouter un champ à un objet est de simplement lui affecter, comme ceci:
la source
pris en charge par la plupart des navigateurs, et il vérifie si la clé d'objet disponible ou non que vous souhaitez ajouter, si elle est disponible, elle remplace la valeur de clé existante et si elle n'est pas disponible, elle ajoute la clé avec la valeur
Exemple 1
exemple 2
exemple 3
la source
Dans le cas où vous avez plusieurs littéraux d'objets anonymes dans un objet et que vous souhaitez ajouter un autre objet contenant des paires clé / valeur, procédez comme suit:
Firebug 'the Object:
Retour:
Code:
va ajouter
Object {name="Peanuts", value="12"}
à l'objet Comicbookla source
Soit
obj['key3'] = value3
ouobj.key3 = value3
ajoutera la nouvelle paire auobj
.Cependant, je sais que jQuery n'a pas été mentionné, mais si vous l'utilisez, vous pouvez ajouter l'objet via
$.extend(obj,{key3: 'value3'})
. Par exemple:jQuery. étendre (cible [, objet1] [, objetN]) fusionne le contenu de deux ou plusieurs objets ensemble dans le premier objet.
Et il permet également des ajouts / modifications récursifs avec
$.extend(true,object1,object2);
:Afficher l'extrait de code
la source
Une manière courte et élégante dans la prochaine spécification Javascript (étape 3 candidate) est:
obj = { ... obj, ... { key3 : value3 } }
Une discussion plus approfondie peut être trouvée dans Object spread vs Object.assign et sur le site du Dr. Axel Rauschmayers .
Il fonctionne déjà dans node.js depuis la version 8.6.0.
Vivaldi, Chrome, Opera et Firefox dans les versions à jour connaissent également cette fonctionnalité, mais Mirosoft ne le sait pas jusqu'à aujourd'hui, ni dans Internet Explorer ni dans Edge.
la source
Sortie comme ceci: -
la source
Vous pouvez soit l'ajouter de cette façon:
ou de cette façon:
Les réponses suggérant la saisie dans l'objet avec la variable
key3
ne fonctionneraient que si la valeur dekey3
était'key3'
.la source
Selon les accesseurs de propriétés définis dans ECMA-262 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67), il existe deux façons de faire pour ajouter des propriétés à un objet existe. Dans tous les cas, le moteur Javascript les traitera de la même manière.
La première façon consiste à utiliser la notation par points:
Mais de cette façon, vous devez utiliser un IdentifierName après la notation par points.
La deuxième façon consiste à utiliser la notation entre crochets:
et une autre forme:
De cette façon, vous pouvez utiliser une expression (inclure IdentifierName ) dans la notation entre crochets.
la source
Nous pouvons également procéder de cette manière.
la source
Puisque c'est une question du passé mais le problème du présent. Suggère une autre solution: passez simplement la clé et les valeurs à la fonction et vous obtiendrez un objet de carte.
la source
Pour ajouter une paire valeur / clé à un objet, le for in fonctionne avec cet élément d'abord:
la source
Le meilleur moyen d'y parvenir est indiqué ci-dessous:
la source
Vous pouvez créer un nouvel objet en utilisant la
{[key]: value}
syntaxe:Avec la syntaxe précédente, vous pouvez maintenant utiliser la syntaxe étendue
{...foo, ...bar}
pour ajouter un nouvel objet sans muter votre ancienne valeur:la source