80 votes

Object.assign — substitue la propriété imbriquée

J'ai un objet a comme ça:

 const a = {
  user: {
   …
   groups: […]
   …
  }
}
 

dans lequel il y a beaucoup plus de propriétés en a.user

Et je voudrais changer uniquement la valeur a.user.groups . Si je fais ça:

 const b = Object.assign({}, a, {
  user: {
    groups: {}
  }
});
 

b n'a pas d'autre propriété que b.user.groups , tous les autres sont supprimés. Existe-t-il un moyen ES6 de ne modifier que la propriété imbriquée, sans perdre tous les autres, avec Object.assign ?

145voto

philipp Points 1953

Après quelques tentatives, je pourrais trouver une solution aussi jolie que celle-ci:

 const b = Object.assign({}, a, {
  user: {
    ...a.user,
    groups: 'some changed value'
  }
});
 

Pour rendre cette réponse plus complète, voici une petite note:

 const b = Object.assign({}, a)
 

est essentiellement le même que:

 const b = { ...a }
 

puisqu'il ne fait que copier toutes les propriétés de a ( ...a ) dans un nouvel objet. Donc, ce qui précède peut être écrit comme:

  const b = {
   ...a,          //copy everything from a
   user: {        //override the user property
      ...a.user,  //same sane: copy the everything from a.user
      groups: 'some changes value'  //override a.user.group
   }
 }
 

8voto

Patryk Wlaź Points 125

Vous avez demandé spécifiquement une méthode ES6 avec Object.assign, mais peut-être que quelqu'un d'autre préférera ma réponse plus générale: vous pouvez le faire facilement avec lodash, et personnellement, je pense que cette solution est plus lisible.

 import * as _ from 'lodash';
_.set(a, 'user.groups', newGroupsValue);
 

Il mute l'objet.

5voto

pratZ Points 1954

Vous pouvez le changer de cette façon,

 const b = Object.assign({}, a, {
  user: Object.assign({}, a.user, {
          groups: {}
        })
});
 

ou juste faire,

 const b = Object.assign({}, a);
b.user.groups = {};
 

4voto

Abdullah Alsigar Points 412

L'Objet.méthode assign() est utilisée pour copier les valeurs de l'ensemble énumérable propres propriétés d'un ou de plusieurs objets de la source à un objet cible. Il sera de retour de l'objet cible.

attribuer méthode va créer un nouvel objet par la copie de l'objet source, le problème, si vous modifiez la méthode, plus tard dans l'objet source, il ne sera pas tenu compte pour le nouvel objet.

Utilisez create()

L'Objet.méthode create() crée un nouvel objet avec le prototype de l'objet et des propriétés.

const b = Object.create(a)
b.user.groups = {}
// if you don't want the prototype link add this
// b.prototype = Object.prototype 

De cette façon, vous avez b lié à une via le prototype et si vous apportez des modifications à un il sera reflété dans b, et toute variation de b n'affectera pas la

2voto

Ballpin Points 36

Première petite réponse de phillips.

 const object1 = {
  abc: {
    a: 1
  }
};

const object2 = {
  abc: {
    b: 2
  }
};

Object.assign(object1, {
    abc: {
        ...object1.abc,
        ...object2.abc
    }
});

console.log(object1);
// Object { abc: Object { a: 1, b: 2 } }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X