Переменная свойства Omit при использовании деструктуризации объекта

Вот пример:

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const { a, ...rest } = initObject

Мы опуская a свойство из объекта, а затем const a присваиваются значение, но никогда не используются - ошибка от eslint (нет-неиспользованного-Пера). Можно ли полностью опустить const a?

Ответ 1

Возможный способ - использовать //eslint-disable-next-line no-unused-vars

например

// eslint-disable-next-line no-unused-vars
const { a, ...rest } = initObject

Или с помощью ignoreRestSiblings

Параметр ignoreRestSiblings имеет логическое значение (по умолчанию: false). Используя свойство Rest, можно "пропустить" свойства объекта, но по умолчанию свойства одного и того же уровня помечены как "неиспользуемые". Если эта опция включена, остальные братья и сестры игнорируются.

например

/*eslint no-unused-vars: ["error", { "ignoreRestSiblings": true }]*/
// 'a' is ignored because it has a rest property sibling.
const { a, ...rest } = initObject;

Больше информации о no-unused-vars


Но если ваша цель состоит в том, чтобы убрать свойство a, есть другой способ.
Вы можете использовать оператор delete.

Из документации MDN

JavaScript delete оператор удаляет свойство из объекта

например

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const rest = { ...initObject }; // create a shallow copy
delete rest.a;

console.log(rest);

Ответ 2

Это может показаться тривиальным отклонением от ответа @R3tep, но оно позволяет избежать ловушки маркировки всех переменных в объявлении как используемых:

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const {
  a, // eslint-disable-line no-unused-vars
  ...rest
} = initObject

Теперь, если rest не используется, он все равно вызовет ошибку eslint.


Что касается вопроса

какой правильный способ удалить свойство тогда?

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

  1. Если вам просто нужны свойства b и c, деструктурируйте только эти свойства:

    const { b, c } = initObject
    

    Даже не признать, что существует, если она не нужна. a

  2. Если ваш ввод имеет много специфических свойств, с которыми вам нужно иметь дело, и вы не можете предположить, что initObject уже имеет точный макет, в котором он нуждается, тогда избегайте соблазна использовать методы отражения или синтаксис, такой как Object.entries(), for...in, синтаксис распространения и отдыха объектов и т.д.

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

    С другой стороны, если вы можете предварительно подготовить входные данные для того, чтобы иметь точный макет, который вам уже нужен (например, вы можете предположить, что initObject имеет только b и c), то не стесняйтесь использовать рефлексию - именно для этого она и initObject.

  3. Если ни один из вышеперечисленных пунктов не относится к вам, и вы все равно обнаружите, что действительно хотите, чтобы initObject имел много произвольных свойств и несколько свойств, которые вы хотите игнорировать, тогда вам следует использовать предложение в начале этого ответа (или один из других ответов, который работает для вас).

    Однако, как уже отмечалось, это запах кода и показатель того, что ваша логика должна быть более мягкой с макетом объекта 1 или ваши предварительные условия для ввода должны измениться 2.

Ответ 3

ошибка от eslint (без неиспользованных переменных).

Правила no-unused-vars имеют две опции конфигурации, которые помогут в вашем случае использования:

  • Параметр ignoreRestSiblings является логическим значением, по умолчанию ignoreRestSiblings false. Когда включено, остальные свойства братьев и сестер игнорируются. Это именно то , что вам нужно!
  • Опция varsIgnorePattern указывает шаблон регулярного выражения для имен переменных, которые не проверяются на предмет использования. Это позволяет нам сделать исключение для общего идентификатора подчеркивания, чтобы явно пометить неиспользуемые переменные с помощью { "varsIgnorePattern": "^_" }.

    const { a:_, ...rest } = initObject;
    //       ^^
    

    К сожалению, вам все еще нужно избегать нескольких объявлений переменной _, поэтому, чтобы пропустить несколько свойств, вам нужно сделать что-то вроде { a:_a, b:_b,...rest } = ….

Можно ли полностью опустить const a?

Плохой хак, который полностью избегает введения какого-либо идентификатора, будет использовать

const { a:{}, ...rest } = initObject;
//       ^^^

это дополнительно разрушает значение свойства .a в объекте, но для этого вам нужно убедиться, что свойство существует и не содержит null или undefined значения.

Ответ 4

Вы можете создать IIFE и передать ему объект.

const initObject = {
  a: 0,
  b: 0,
  c: 0
}
const res = (({a,...rest}) => (a,rest))(initObject);
console.log(res)

Ответ 5

Вариант, который технически соответствует правилам ЛИНТЕР бы объявить rest заранее, destructure в a собственности в rest, а затем использовать синтаксис остальное положить остальную часть объекта в rest имя переменной:

const initObject = {
  a: 0,
  b: 0,
  c: 0
};
let rest;
({ a: rest, ...rest } = initObject);

console.log(rest);

Ответ 6

Вы можете создать поверхностную копию объекта с помощью Object.assign() и просто удалить свойство.

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

let rest = Object.assign({}, initObject);
delete rest.a;

console.log(rest);
console.log(initObject);

Ответ 7

пытаться

const rest = ((o)=> (delete o.a,o))({...initObject});

'use strict'

const initObject = {
  a: 0,
  b: 0,
  c: 0
}

const rest = ((o)=> (delete o.a,o))({...initObject});

console.log({initObject,rest});