J'essaie de créer une méthode de carte de copie profonde pour mon projet Redux qui fonctionnera avec des objets plutôt que des tableaux. J'ai lu que dans Redux, chaque état ne devrait rien changer aux états précédents.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Ça marche:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Cependant, il ne copie pas en profondeur les éléments internes, je dois donc le modifier pour:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Ceci est moins élégant car il nécessite de savoir quels objets sont passés. Existe-t-il un moyen dans ES6 d'utiliser la syntaxe de diffusion pour copier en profondeur un objet?
combineReducers
pour composer les deux (ou plus) ensemble. Si vous utilisez des techniques de redux idiomatiques, votre problème de clonage profond des objets disparaît.Réponses:
Aucune fonctionnalité de ce type n'est intégrée à ES6. Je pense que vous avez quelques options en fonction de ce que vous voulez faire.
Si vous voulez vraiment copier en profondeur:
cloneDeep
méthode.Solution alternative à votre problème spécifique (pas de copie profonde)
Cependant, je pense que si vous êtes prêt à changer quelques choses, vous pouvez vous épargner du travail. Je suppose que vous contrôlez tous les sites d'appels à votre fonction.
Spécifiez que tous les rappels passés à
mapCopy
doivent renvoyer de nouveaux objets au lieu de muter l'objet existant. Par exemple:Cela permet de
Object.assign
créer un nouvel objet, définit les propriétés dee
sur ce nouvel objet, puis définit un nouveau titre sur ce nouvel objet. Cela signifie que vous ne modifiez jamais les objets existants et n'en créez de nouveaux que si nécessaire.mapCopy
peut être très simple maintenant:Essentiellement,
mapCopy
c'est faire confiance à ses appelants pour faire la bonne chose. C'est pourquoi j'ai dit que cela suppose que vous contrôlez tous les sites d'appel.la source
Utilisez plutôt ceci pour la copie profonde
la source
De MDN
Personnellement, je suggère d'utiliser la fonction cloneDeep de Lodash pour le clonage d'objets / tableaux à plusieurs niveaux.
Voici un exemple de travail:
la source
Run code snippet
et il doit fonctionner correctement.J'utilise souvent ceci:
la source
Utiliser
JSON.stringify
etJSON.parse
est le meilleur moyen. Parce qu'en utilisant l'opérateur spread, nous n'obtiendrons pas la réponse efficace lorsque l'objet json contient un autre objet à l'intérieur. nous devons le spécifier manuellement.la source
la source
la source
la source
J'ai moi-même atterri sur ces réponses le jour dernier, essayant de trouver un moyen de copier en profondeur des structures complexes, qui peuvent inclure des liens récursifs. Comme je n'étais pas satisfait de tout ce qui avait été suggéré auparavant, j'ai moi-même implémenté cette roue. Et ça marche plutôt bien. J'espère que ça aide quelqu'un.
Exemple d'utilisation:
Veuillez regarder https://github.com/latitov/JS_DeepCopy pour des exemples en direct sur la façon de l'utiliser, et deep_print () est également là.
Si vous en avez besoin rapidement, voici la source de la fonction deep_copy ():
À votre santé@!
la source
Voici mon algorithme de copie profonde.
la source
Voici la fonction deepClone qui gère tous les types de données primitives, tableau, objet, fonction
la source