Удалить значение из объекта без его изменения
каков хороший и короткий способ удалить значение из объекта в определенном ключе без изменения исходного объекта?
Я хотел бы сделать что-то вроде:
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 ответов:
обновление:
вы можете удалить свойство из объекта с хитрой Реструктуризующее присваивание:
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 }
как предложено в комментариях выше, если вы хотите расширить это, чтобы удалить более одного элемента из вашего
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; }