Par exemple si j'ai deux objets:
var foo = {
x: "bar",
y: "baz"
}
et
var oof = {}
et je voulais transférer les valeurs x et y de foo à oof. Existe-t-il un moyen de le faire en utilisant la syntaxe de déstructuration es6?
peut-être quelque chose comme:
oof{x,y} = foo
javascript
ecmascript-6
destructuring
majorBummer
la source
la source
Object.assign(oof, foo)
Object.assign
Réponses:
Bien que moche et un peu répétitif, vous pouvez le faire
qui lira les deux valeurs de l'
foo
objet, et les écrira à leurs emplacements respectifs sur l'oof
objet.Personnellement, je préfère encore lire
ou
bien que.
la source
var oof = {};
.({x: oof.x, y: oof.y} = foo)
? Je pense que vous avez mis un f supplémentaire dans oof .Non, la déstructuration ne prend pas en charge les expressions de membres en raccourcis, mais uniquement les noms de propriété simples pour le moment. Il y a eu des discussions à ce sujet sur esdiscuss, mais aucune proposition ne sera intégrée dans ES6.
Vous pourrez peut-être utiliser
Object.assign
cependant - si vous n'avez pas besoin de toutes vos propres propriétés, vous pouvez toujours le fairela source
--harmony_destructuring
activé. Je vois «SyntaxError: jeton inattendu».{oof.x, oof.y} = foo
. Ou peut-être que je l'avais vraiment manqué.IMO, c'est le moyen le plus simple d'accomplir ce que vous recherchez:
Fondamentalement, déstructurez en variables, puis utilisez le raccourci d'initialisation pour créer un nouvel objet. Pas besoin d
Object.assign
Je pense que c'est le moyen le plus lisible, de toute façon. Vous pouvez par la présente sélectionner les accessoires exacts
someObject
que vous souhaitez. Si vous avez un objet existant dans lequel vous souhaitez simplement fusionner les accessoires, faites quelque chose comme ceci:Une autre façon, sans doute plus propre, de l'écrire est:
Je l'utilise
POST
beaucoup pour les demandes où je n'ai besoin que de quelques éléments de données discrètes. Mais, je suis d'accord qu'il devrait y avoir une seule ligne pour faire cela.EDIT: PS - J'ai récemment appris que vous pouvez utiliser l'ultra déstructuration dans la première étape pour extraire des valeurs imbriquées d'objets complexes! Par exemple...
De plus, vous pouvez utiliser l'opérateur de propagation au lieu d'Object.assign lors de la création d'un nouvel objet:
Ou...
la source
Autre que
Object.assign
il y a la syntaxe de propagation d'objet qui est une proposition de l'étape 2 pour ECMAScript.Mais pour utiliser cette fonctionnalité, vous devez utiliser
stage-2
untransform-object-rest-spread
plugin pour babel. Voici une démo sur babel avecstage-2
la source
Plugin BabelJS
Si vous utilisez BabelJS, vous pouvez maintenant activer mon plugin
babel-plugin-transform-object-from-destructuring
( voir le package npm pour l'installation et l'utilisation ).J'ai eu le même problème décrit dans ce fil et pour moi c'était très épuisant lorsque vous créez un objet à partir d'une expression de déstructuration, en particulier lorsque vous devez renommer, ajouter ou supprimer une propriété. Avec ce plugin, maintenir de tels scénarios devient beaucoup plus facile pour vous.
Exemple d'objet
peut s'écrire:
Exemple de tableau
peut s'écrire:
la source
let myTest = { test1, test3 } = myObject;
ne fonctionne pasC'est tout à fait possible. Mais pas dans une seule déclaration.
(Notez la parenthèse autour de l'instruction.) Mais gardez à l'esprit que la lisibilité est plus importante que le code-golf :).
Source: http://exploringjs.com/es6/ch_destructuring.html#sec_assignment-targets
la source
Vous pouvez simplement utiliser la restructuration pour cela comme ceci:
Ou fusionnez les deux objets si oof a des valeurs:
la source
oof = {...oof, ...foo}
Vous pouvez renvoyer l'objet déstructuré dans une fonction de flèche et utiliser Object.assign () pour l'affecter à une variable.
la source
SEC
ou
la source
Vous pouvez détruire un objet en l'affectant directement à un autre attribut d'objet.
Exemple de travail:
Vous pouvez travailler avec la destruction en utilisant des variables avec le même nom d'attribut d'objet que vous voulez attraper, de cette façon vous n'avez pas besoin de faire:
Utilisez de cette façon:
De la même manière, vous pouvez définir de nouvelles valeurs pour les structures d'objets si elles ont le même nom d'attribut.
Regardez cet exemple de travail:
la source
Cela fonctionne dans Chrome 53.0.2785.89
la source
oof
simplement recevoir une référencefoo
et contourner toute la déstructuration (au moins dans Chrome).oof === foo
etlet oof = { x } = foo
retourne encore{ x, y }
J'ai trouvé cette méthode:
Que vous pouvez utiliser comme ceci:
c'est-à-dire que vous pouvez choisir les propriétés que vous voulez et les mettre dans un nouvel objet. contrairement à
_.pick
vous, vous pouvez également les renommer en même temps.Si vous souhaitez copier les accessoires sur un objet existant, définissez simplement
dest
arg.la source
C'est une sorte de triche, mais vous pouvez faire quelque chose comme ça ...
En pratique, je pense que vous voudrez rarement l'utiliser. Ce qui suit est BEAUCOUP plus clair ... mais pas aussi amusant.
Un autre itinéraire complètement différent, qui comprend le déblayage avec le prototype (attention maintenant ...):
la source
C'est la solution la plus lisible et la plus courte que je puisse proposer:
Il sortira
{ isValidDate: 'yes' }
Ce serait bien de pouvoir un jour dire quelque chose comme
let newProps = ({ isValidDate } = props)
mais malheureusement ce n'est pas quelque chose que ES6 prend en charge.la source
Ce n'est pas une belle façon, ni je le recommande, mais c'est possible de cette façon, juste pour la connaissance.
la source
Vous pouvez utiliser des méthodes de classe JSON pour y parvenir comme suit
Passez les propriétés qui doivent être ajoutées à l'objet résultant comme deuxième argument pour
stringify
fonctionner dans un format de tableau.MDN Doc pour JSON.stringify
la source