J'ai un objet JS plat:
{a: 1, b: 2, c: 3, ..., z:26}
Je veux cloner l'objet à l'exception d'un élément:
{a: 1, c: 3, ..., z:26}
Quelle est la façon la plus simple de le faire (préférant utiliser es6 / 7 si possible)?
J'ai un objet JS plat:
{a: 1, b: 2, c: 3, ..., z:26}
Je veux cloner l'objet à l'exception d'un élément:
{a: 1, c: 3, ..., z:26}
Quelle est la façon la plus simple de le faire (préférant utiliser es6 / 7 si possible)?
Réponses:
Si vous utilisez Babel, vous pouvez utiliser la syntaxe suivante pour copier la propriété b de x dans la variable b, puis copier le reste des propriétés dans la variable y :
et il sera transposé en:
la source
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
été ajoutée dans la v3.15.0 (3 février 2017). Voir: commit c59a0bab
portée.ou si vous acceptez que la propriété ne soit pas définie:
la source
Pour ajouter à la réponse d'Ilya Palkin: vous pouvez même supprimer dynamiquement des clés:
Démo dans Babel REPL
La source:
la source
_
ce qui est autorisé pour une variable que vous n'avez pas l'intention d'utiliser?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Pour ceux qui ne peuvent pas utiliser ES6, vous pouvez utiliser
lodash
ouunderscore
.Ou
ramda
.la source
_.omit(x, 'b')
delete
.J'utilise cette doublure ESNext one
Si vous avez besoin d'une fonction à usage général:
la source
map
vous pouvez faire:(({b, c, ...others}) => ({...others}))(obj)
Vous pouvez lui écrire une fonction d'assistance simple. Lodash a une fonction similaire avec le même nom: omettre
Notez également qu'il est plus rapide que Object.assign et supprimez ensuite: http://jsperf.com/omit-key
la source
Peut-être quelque chose comme ça:
Est-ce assez bon? Ou ne pouvez-vous pas
c
réellement les copier?la source
Utilisation de la déstructuration d'objets
la source
_
ne résout pas le problème pour ESLint ...Hé, vous semblez rencontrer des problèmes lorsque vous essayez de copier un objet, puis de supprimer une propriété. Quelque part, vous devez attribuer des variables primitives afin que javascript crée une nouvelle valeur.
Truc simple (peut-être horrible) que j'ai utilisé était-ce
la source
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Vous n'avez même pas besoin de le supprimer, il suffit d'une valeur falsifiée.Voici une option pour omettre les clés dynamiques qui, je crois, n'a pas encore été mentionnée:
removeMe
est aliaséremovedKey
et ignoré.newObj
devient{ 2: 2, 3: 3, 4: 4 }
. Notez que la clé supprimée n'existe pas, la valeur n'était pas simplement définie surundefined
.la source
la source
Lodash omettent
la source
Vous pouvez également utiliser l'opérateur d'étalement pour ce faire
la source
copy
const copy = { ...source, b: undefined }
se résume exactement à la même chose.Les solutions ci-dessus utilisant la structuration souffrent du fait que vous avez une variable utilisée, ce qui peut provoquer des plaintes d'ESLint si vous l'utilisez.
Voici donc mes solutions:
Sur la plupart des plateformes (sauf IE sauf si vous utilisez Babel), vous pouvez également faire:
la source
Que dis-tu de ça:
la source
Si vous avez affaire à une énorme variable, vous ne voulez pas la copier puis la supprimer, car cela serait inefficace.
Une simple boucle for avec un contrôle hasOwnProperty devrait fonctionner, et elle est beaucoup plus adaptable aux besoins futurs:
la source
Et ça? Je n'ai jamais trouvé ce bagout mais j'essayais simplement d'exclure une ou plusieurs propriétés sans avoir besoin de créer un objet supplémentaire. Cela semble faire l'affaire, mais il y a des effets secondaires que je ne peux pas voir. Pour sûr, ce n'est pas très lisible.
la source
Je l'ai fait de cette façon, comme un exemple de mon réducteur Redux:
En d'autres termes:
la source
const { [removeMe]: removedKey, ...newObj } = obj;
- voir ma réponse sur cette question.Je l'ai fait récemment de cette manière très simple:
en utilisant simplement l' opérateur spread pour séparer la propriété indésirable:
... et object.assign pour ne prendre que la partie "reste":
la source
rest
est déjà un nouvel objet - vous n'avez pas besoin de la dernière ligne. De plus, cela est identique à la solution acceptée.la source