Переменная свойства 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.
Что касается вопроса
какой правильный способ удалить свойство тогда?
Я собираюсь ответить на вопрос, который вы должны были задать вместо этого. Правильный способ обработки объекта со свойствами, которые вам не нужны, - переписать свою логику так, чтобы она неявно игнорировала их.
-
Если вам просто нужны свойства b
и c
, деструктурируйте только эти свойства:
const { b, c } = initObject
Даже не признать, что существует, если она не нужна. a
-
Если ваш ввод имеет много специфических свойств, с которыми вам нужно иметь дело, и вы не можете предположить, что initObject
уже имеет точный макет, в котором он нуждается, тогда избегайте соблазна использовать методы отражения или синтаксис, такой как Object.entries()
, for...in
, синтаксис распространения и отдыха объектов и т.д.
Продолжайте обрабатывать конкретные свойства, которые вам нужны, на индивидуальной основе и разбивайте свою логику на отдельные функции, каждая из которых имеет дело с управляемым подмножеством свойств, если это необходимо.
С другой стороны, если вы можете предварительно подготовить входные данные для того, чтобы иметь точный макет, который вам уже нужен (например, вы можете предположить, что initObject
имеет только b
и c
), то не стесняйтесь использовать рефлексию - именно для этого она и initObject
.
-
Если ни один из вышеперечисленных пунктов не относится к вам, и вы все равно обнаружите, что действительно хотите, чтобы 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});