Quel est le moyen efficace et court de supprimer une valeur d'un objet à une clé spécifique sans muter l'objet d'origine?
J'aimerais faire quelque chose comme:
let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined
Je sais qu'il existe de nombreuses bibliothèques d'immuabilité pour de telles tâches, mais j'aimerais m'en sortir sans bibliothèque. Mais pour ce faire, une exigence serait d'avoir un moyen simple et court qui puisse être utilisé dans tout le code, sans soustraire la méthode en tant que fonction d'utilité.
Par exemple, pour ajouter une valeur, je fais ce qui suit:
let o2 = {...o1, age: 31};
C'est assez court, facile à retenir et ne nécessite pas de fonction utilitaire.
Y a-t-il quelque chose comme ça pour supprimer une valeur? ES6 est le bienvenu.
Merci beaucoup!
javascript
immutability
Amann
la source
la source
Réponses:
Mettre à jour:
Vous pouvez supprimer une propriété d'un objet avec une affectation de Destructuration délicate :
Cependant, si le nom de la propriété que vous souhaitez supprimer est statique, vous pouvez le supprimer avec une simple ligne:
Le moyen le plus simple est simplement deou vous pouvez cloner votre objet avant de le muter:Vous pouvez également utiliser la
omit
fonction de lalodash
bibliothèque utilitaire :Il est disponible dans le cadre du package lodash ou en tant que package lodash.omit autonome .
la source
a2 = a1.filter(el => el.id !== id)
omettre un élément dans un tableau par un identifiant spécifique. N'y a-t-il pas une telle chose pour un objet?keep_if
const {[prop], ...rest} = obj
marche pas ? Pourquoi devez-vous affecter la propriété extraite à une nouvelle variable (omit
dans ce cas)?Avec la déstructuration d'objets ES7:
la source
a
est stocké dans une variableconst x = 'a'
?const { a,b, ...noA } = myObject;
console.log(noA); // => {c: 3 }
solution une ligne
la source
Comme suggéré dans les commentaires ci-dessus, si vous souhaitez étendre cela pour supprimer plus d'un élément de votre
object
j'aime utiliserfilter
. etreduce
par exemple
la source
Pour ajouter du piquant apportant de la performance. Vérifiez ce fil ci-dessous
https://github.com/googleapis/google-api-nodejs-client/issues/375
Vous pouvez aussi utiliser la méthode destructrice
Et un exemple plus pratique:
Comme vous pouvez le voir, vous pouvez utiliser la
[somePropsVarForDynamicName]: scopeVarName
syntaxe pour les noms dynamiques. Et vous pouvez tout mettre entre crochets (nouveau bloc) pour que le reste soit récupéré après.Voici un test:
exec:
Ou nous pouvons aller avec une fonction comme
pour dactylographié
Usage:
De cette façon, un nouvel objet est créé. Et la propriété rapide de l'objet est conservée. Ce qui peut être important ou important. Si le mappage et l'objet seront consultés plusieurs fois.
L'association
undefined
peut également être une bonne façon de procéder. Quand vous pouvez vous le permettre. Et pour les clés, vous pouvez également vérifier la valeur. Par exemple, pour obtenir toutes les clés actives, vous faites quelque chose comme:Undefined ne convient pas pour une grande liste. Ou le développement au fil du temps avec de nombreux accessoires à venir. Comme l'utilisation de la mémoire continuera d'augmenter et ne sera jamais nettoyée. Cela dépend donc de l'utilisation. Et simplement créer un nouvel objet semble être le bon moyen.
Ensuite, la
Premature optimization is the root of all evil
volonté entrera en jeu. Vous devez donc être conscient du compromis. Et ce qui est nécessaire et ce qui ne l'est pas.Remarque sur _.omit () de lodash
Il est supprimé de la version 5. Vous ne pouvez pas le trouver dans le dépôt. Et voici un numéro qui en parle.
https://github.com/lodash/lodash/issues/2930
v8
Vous pouvez vérifier ceci qui est une bonne lecture https://v8.dev/blog/fast-properties
la source
avec lodash clone
(Remarque: le clone lodash peut être utilisé à la place pour les objets peu profonds)
la source
Pour mon code, je voulais une version courte pour la valeur de retour de map () mais les solutions d'opérations multilignes / mutli étaient "moche". La caractéristique clé est l'ancien
void(0)
qui se résout àundefined
.La propriété reste dans l'objet:
mais le framework de transmission le tue pour moi (bc stringify):
la source
Mon problème avec la réponse acceptée, à partir d'une norme de règle ESLint, si vous essayez de déstructurer:
les 2 nouvelles variables,
notNeeded
etalsoNotNeeded
peut générer un avertissement ou une erreur en fonction de votre configuration car elles sont maintenant inutilisées. Alors pourquoi créer de nouveaux vars si inutilisés?Je pense que vous devez
delete
vraiment utiliser la fonction.la source
no-unused-vars
règle a en fait une optionignoreRestSiblings
maintenant pour couvrir ce cas d'utilisation: eslint.org/docs/rules/no-unused-vars#ignorerestsiblings