web-dev-qa-db-fra.com

Supprimer la valeur de l'objet sans le muter

Quel est le moyen le plus simple et le plus rapide de supprimer une valeur d’un objet situé sur une clé spécifique sans faire 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 ce type de tâches, mais j’aimerais bien me passer de bibliothèque. Mais pour ce faire, il serait indispensable de disposer d’un moyen simple et rapide pouvant être utilisé dans tout le code, sans résumer 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.

Existe-t-il quelque chose comme ceci pour supprimer une valeur? ES6 est la bienvenue.

Merci beaucoup!

60
amann

Mettre à jour:

Vous pouvez supprimer une propriété d'un objet avec une tâche délicate Destructuring :

const doSomething = (obj, prop) => {
  let {[prop]: omit, ...res} = obj
  return res
}

Toutefois, si le nom de propriété que vous souhaitez supprimer est statique, vous pouvez le supprimer avec un simple interligne:

let {lastname, ...o2} = o

Le plus simple est simplement de Ou vous pouvez cloner votre objet avant de le muter:

const doSomething = (obj, prop) => {
  let res = Object.assign({}, obj)
  delete res[prop]
  return res
}

Vous pouvez également utiliser la fonction omit DE LA BIBLIOTHÈQUE D'UTILITAIRES lodash :

let o2 = _.omit(o, 'lastname')

Il est disponible dans le package lodash ou en tant que package autonome lodash.omit .

148
Leonid Beschastny

solution en une ligne

const removeKey = (key, {[key]: _, ...rest}) => rest;
11
punksta

Avec la déstructuration d'objet ES7:

const myObject = {
  a: 1,
  b: 2,
  c: 3
};
const { a, ...noA } = myObject;
console.log(noA); // => { b: 2, c: 3 }
6
senbon

Comme suggéré dans les commentaires ci-dessus, si vous souhaitez étendre cette option à plusieurs éléments de votre object, j'aime utiliser filter. et reduce

par exemple

    const o = {
      "firstname": "Jane",
      "lastname": "Doe",
      "middlename": "Kate",
      "age": 23,
      "_id": "599ad9f8ebe5183011f70835",
      "index": 0,
      "guid": "1dbb6a4e-f82d-4e32-bb4c-15ed783c70ca",
      "isActive": true,
      "balance": "$1,510.89",
      "picture": "http://placehold.it/32x32",
      "eyeColor": "green",
      "registered": "2014-08-17T09:21:18 -10:00",
      "tags": [
        "consequat",
        "ut",
        "qui",
        "nulla",
        "do",
        "sunt",
        "anim"
      ]
    };

    const removeItems = ['balance', 'picture', 'tags']
    console.log(formatObj(o, removeItems))

    function formatObj(obj, removeItems) {
      return {
        ...Object.keys(obj)
          .filter(item => !isInArray(item, removeItems))
          .reduce((newObj, item) => {
            return {
              ...newObj, [item]: obj[item]
            }
          }, {})
      }
    }

    function isInArray(value, array) {
      return array.indexOf(value) > -1;
    }

2
ak85

avec lodash cloneDeep et delete 

(note: le clone lodash peut être utilisé à la place pour les objets peu profonds)

const obj = {a: 1, b: 2, c: 3}
const unwantedKey = 'a'

const _ = require('lodash')
const objCopy = _.cloneDeep(obj)
delete objCopy[unwantedKey]
// objCopy = {b: 2, c: 3}
0
FFF