Удалить значение из объекта без его изменения


каков хороший и короткий способ удалить значение из объекта в определенном ключе без изменения исходного объекта?

Я хотел бы сделать что-то вроде:

let o = {firstname: 'Jane', lastname: 'Doe'};
let o2 = doSomething(o, 'lastname');
console.log(o.lastname); // 'Doe'
console.log(o2.lastname); // undefined

Я знаю, что есть много библиотек неизменности для таких задач, но я хотел бы уйти без библиотеки. Но для этого необходимо иметь простой и короткий способ, который можно использовать во всем коде, не абстрагируя метод как утилиту функция.

например, для добавления значения я делаю следующее:

let o2 = {...o1, age: 31};

Это довольно короткий, легко запоминается и не нуждается в функции полезности.

есть ли что-то подобное для удаления значения? ES6 очень приветствуется.

большое спасибо!

5 52

5 ответов:

обновление:

вы можете удалить свойство из объекта с хитрой Реструктуризующее присваивание:

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

хотя, если имя свойства, которое вы хотите удалить, является статическим, то вы можете удалить его с помощью простого однострочного:

let {lastname, ...o2} = o

самый простой способ-это просто или вы можете клонировать свой объект, прежде чем мутировать его:

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

в качестве альтернативы вы можете использовать

однострочное решение

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

как предложено в комментариях выше, если вы хотите расширить это, чтобы удалить более одного элемента из вашего object Мне нравится использовать filter. и reduce

например

    const o = {
      "firstname": "Jane",
      "lastname": "Doe",
      "middlename": "Kate",
      "age": 23,
      "_id": "599ad9f8ebe5183011f70835",
      "index": 0,
      "guid": "1dbb6a4e-f82d-4e32-bb4c-15ed783c70ca",
      "isActive": true,
      "balance": ",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;
    }

С lodash cloneDeep и delete

(Примечание: клон lodash может использоваться вместо мелких объектов)

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}

С деструктурированием объекта ES7:

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