J'utilise Redux. Dans mon réducteur, j'essaye de supprimer une propriété d'un objet comme celui-ci:
const state = {
a: '1',
b: '2',
c: {
x: '42',
y: '43'
},
}
Et je veux avoir quelque chose comme ça sans avoir à muter l'état d'origine:
const newState = {
a: '1',
b: '2',
c: {
x: '42',
},
}
J'ai essayé:
let newState = Object.assign({}, state);
delete newState.c.y
mais pour certaines raisons, il supprime la propriété des deux états.
Pourrait m'aider à faire ça?
javascript
immutability
redux
Vincent Taing
la source
la source
Object.assign
crée uniquement une copie superficielle destate
et doncstate.c
etnewState.c
pointera vers le même objet partagé. Vous avez essayé de supprimer la propriétéy
de l'objet partagéc
et non du nouvel objetnewState
.Réponses:
Que diriez-vous d'utiliser la syntaxe d' affectation de déstructuration ?
la source
const deleteProperty = ({[key]: _, ...newObj}, key) => newObj;
. Utilisation:deleteProperty({a:1, b:2}, "a");
donne{b:2}
deep['c']
est vide, donc dans un cas général, vous voudrez peut-être ajouter une vérification de la présence de la clé.Je trouve les méthodes de tableau ES5 comme
filter
,map
etreduce
utiles car elles renvoient toujours de nouveaux tableaux ou objets. Dans ce cas, j'utiliseraisObject.keys
pour parcourir l'objet etArray#reduce
le transformer en objet.la source
myObject
avec la clémyKey
retirée:Object.keys(myObject).reduce((acc, cur) => cur === myKey ? acc : {...acc, [cur]: myObject[cur]}, {})
Vous pouvez utiliser à
_.omit(object, [paths])
partir de la bibliothèque lodashle chemin peut être imbriqué par exemple:
_.omit(object, ['key1.key2.key3'])
la source
_.omit
impossible de supprimer les propriétés profondes (ce qu'OP demandait). Il y a unomit-deep-lodash
module à cet effet._.cloneDeep(obj)
de lodash. Cela copie facilement l'objet et vous pouvez simplement utiliser jsdelete obj.[key]
pour supprimer la clé.Utilisez simplement la fonction de déstructuration d'objets ES6
la source
const {y, ...c} = state.c
peut être un peu plus clair que d 'en avoir deuxc
sur le côté gauche.const name = 'c'
alors vous pouvez le faireconst {[name]:deletedValue, ...newState} = state
puis retournernewState
dans votre réducteur. Ceci est pour une suppression de clé de niveau supérieurC'est parce que vous copiez la valeur de
state.c
dans l'autre objet. Et cette valeur est un pointeur vers un autre objet javascript. Ainsi, ces deux pointeurs pointent vers le même objet.Essaye ça:
Vous pouvez également faire une copie complète de l'objet. Consultez cette question et vous trouverez ce qui vous convient le mieux.
la source
state.c
est une référence, et la référence est copiée très bien. Redux veut une forme d'état normalisée, ce qui signifie utiliser des identifiants au lieu de références lors de l'imbrication de l'état. Consultez les documents redux: redux.js.org/docs/recipes/reducers/NormalizingStateShape.htmlQue dis-tu de ça:
Il filtre la clé à supprimer puis crée un nouvel objet à partir des clés restantes et de l'objet initial. L'idée est volée au génial programme reactjs de Tyler McGinnes.
JSBin
la source
Aussi, si vous recherchez une boîte à outils de programmation fonctionnelle, regardez Ramda .
la source
Vous pouvez utiliser l' assistant d'immuabilité pour annuler la définition d'un attribut, dans votre cas:
la source
À partir de 2019, une autre option consiste à utiliser la
Object.fromEntries
méthode. Il a atteint le stade 4.Ce qui est bien, c'est qu'il gère bien les clés entières.
la source
C'est facile avec Immutable.js :
description de deleteIn ()
la source
Le problème que vous rencontrez est que vous ne clonez pas en profondeur votre état initial. Vous avez donc une copie superficielle.
Vous pouvez utiliser l'opérateur de diffusion
Ou en suivant votre même code
la source
J'utilise normalement
Je me rends compte que cela ne supprime pas réellement la propriété, mais à presque toutes les fins 1 son équivalent fonctionnellement. La syntaxe pour cela est beaucoup plus simple que les alternatives qui, à mon avis, sont un très bon compromis.
1 Si vous utilisez
hasOwnProperty()
, vous devrez utiliser la solution la plus compliquée.la source
J'utilise ce modèle
mais dans le livre j'ai vu un autre modèle
la source
utilité;))
type d'action
créateur d'action
réducteur
la source
Comme indiqué dans certaines des réponses déjà, c'est parce que vous essayez de modifier un état imbriqué ie. un niveau plus profond. Une solution canonique serait d'ajouter un réducteur au
x
niveau de l' état:Réducteur de niveau plus profond
Réducteur de niveau d'origine
la source