JavaScript - распространять и использовать синтаксис для удаления определенного свойства из объекта

У меня есть объект следующим образом:

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

Я хотел бы удалить конкретное свойство, вызвав метод, который принимает в качестве параметра имя свойства для удаления

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

проблема в том, что этот метод работает, только когда мы записываем имя свойства непосредственно в синтаксис, например: let { bar, _, ...result } = obj.Но это не работает, передавая его в качестве параметра, потому что синтаксическая команда создает его как новую переменную

как мы можем это сделать, с другим решением, если это возможно, кроме omit Лодаш

2 ответа

Решение

Вы можете использовать вычисленные свойства в деструктурировании:

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

Это назначит свойство с именем значения propertyName к одноразовой переменной и по существу удалите этот ключ. Смотрите документацию MDN.

Еще одна альтернатива destructuring будет использовать delete, Следующее решение уменьшает сложность времени примерно на 35% по сравнению с destructuring (в Desktop Chrome)

Решение

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'));

Тест производительности

https://jsperf.com/so53753276

Результаты варьируются в зависимости от используемого браузера. Результаты довольно интригующие. Настольное Safari destructuring Превосходит delete, но Desktop Chrome Out выполняет все числа из Desktop Safari.

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

Результаты на iOS менее удивительны, так как Chrome - это действительно Safari под капотом.

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

Документация

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

values = {
    id: 1,
    name: 'hello world',
    vehicle: 'car',
    time: '3.30 pm',
    date: '02 MAR 1990',
};

const { time, date, ...rest } = values;

now ***...rest*** contains the object values of {
    id: 1,
    name: 'hello world',
    vehicle: 'car',
};
Другие вопросы по тегам