web-dev-qa-db-fra.com

JavaScript - syntaxe de propagation et de repos pour supprimer une propriété spécifique de l'objet

J'ai un objet comme suit:

let obj = {foo: 1, bar: 2, baz: 3}

Je souhaite supprimer une propriété spécifique en appelant une méthode qui prend en paramètre le nom de la propriété à supprimer

removeProperty(obj, propertyName) {
  let { propertyName, _, ...result } = obj
  return result
}

le problème est que cette méthode ne fonctionne que lorsque nous écrivons le nom de la propriété directement dans la séquence de syntaxe, comme: let { bar, _, ...result } = obj .Mais cela ne fonctionne pas en le passant comme paramètre, car la syntaxe spead le crée comme une nouvelle variable

comment pouvons-nous faire cela, avec une autre solution si possible, sauf le omit de lodash

6
Mouad Ennaciri

Vous pouvez utiliser des propriétés calculées dans la déstructuration:

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let { [propertyName]: _, ...result } = obj
  return result
}
console.log(removeProperty(obj, 'foo'));

Cela affectera la propriété avec le nom de la valeur propertyName à une variable jetable et supprimera essentiellement cette clé. Voir la documentation MDN .

16
Li357

Une autre alternative à destructuring serait d'utiliser delete. La solution suivante réduit la complexité temporelle d'environ 35% par rapport à destructuring (dans Chrome de bureau)

Solution

let obj = {foo: 1, bar: 2, baz: 3}
function removeProperty(obj, propertyName) {
  let newObj = {...obj};
  delete newObj[propertyName];
  return newObj;
}
console.log(removeProperty(obj, 'foo'));

Test de performance

https://jsperf.com/so53753276

Les résultats varient en fonction du navigateur utilisé. Les résultats sont plutôt intrigants. Desktop Safari destructuring surpasse delete, mais Desktop Chrome out exécute tous les nombres de Desktop Safari.

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 3,229,791 | 1,993,256   |
| Safari  | 1,186,679 | 1,872,396   | 
+---------+-----------+-------------+

Les résultats sur iOS sont moins surprenants, car Chrome est vraiment Safari sous le capot.

+-----------------------------------+
| Browser | delete    | destructure |
+---------+-----------+-------------+
| Chrome  | 1,146,496 | 1,785,551   |
| Safari  | 1,182,067 | 1,793,772   | 
+---------+-----------+-------------+

Documentation

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

5
AnonymousSB