У меня есть плоский объект JS:
{a: 1, b: 2, c: 3, ..., z:26}
Я хочу клонировать объект, за исключением одного элемента:
{a: 1, c: 3, ..., z:26}
Какой самый простой способ сделать это (предпочитая использовать es6 / 7, если это возможно)?
У меня есть плоский объект JS:
{a: 1, b: 2, c: 3, ..., z:26}
Я хочу клонировать объект, за исключением одного элемента:
{a: 1, c: 3, ..., z:26}
Какой самый простой способ сделать это (предпочитая использовать es6 / 7, если это возможно)?
Ответы:
Если вы используете Babel, вы можете использовать следующий синтаксис, чтобы скопировать свойство b из x в переменную b, а затем скопировать остальные свойства в переменную y :
и он будет перенесен в:
источник
let x = [{a: 1, b: 2, c: 3, z:26}, {a: 5, b: 6, c: 7, z:455}];
ignoreRestSiblings
была добавлена опция (3 февраля 2017 г.). Смотрите: commit c59a0bab
в области.или если вы принимаете свойство неопределенным:
источник
Чтобы добавить к ответу Ильи Палкина: вы можете даже динамически удалять ключи:
Демо в Babel REPL
Источник:
источник
_
которого разрешено для переменной, которую вы не собираетесь использовать?var b = {a:44, b:7, c:1}; let {['a']:z, ...others} = b; console.log(z , others ); // logs: 44, {b:7, c:1}
Для тех, кто не может использовать ES6, вы можете использовать
lodash
илиunderscore
.Или
ramda
.источник
_.omit(x, 'b')
delete
.Я использую этот лайнер ESNext
Если вам нужна функция общего назначения:
источник
map
вы можете сделать:(({b, c, ...others}) => ({...others}))(obj)
Вы можете написать простую вспомогательную функцию для него. У Lodash есть похожая функция с тем же именем: omit
Кроме того, обратите внимание, что это быстрее, чем Object.assign и затем удалите: http://jsperf.com/omit-key
источник
Может быть, что-то вроде этого:
Это достаточно хорошо? Или на
c
самом деле не может быть скопировано?источник
Использование уничтожения объектов
источник
_
не решает проблему для ESLint ...Эй, кажется, вы столкнулись с проблемами, когда пытаетесь скопировать объект и удалить свойство. Где-то вы должны назначить примитивные переменные, чтобы javascript сделал новое значение.
Простой трюк (может быть ужасно), я использовал это
источник
JSON.parse(JSON.stringify(Object.assign({}, obj, { key2: undefined })));
. Не нужно даже удалять его, просто нужно ложное значение.Вот вариант для пропуска динамических ключей, который, я считаю, еще не был упомянут:
removeMe
псевдонимremovedKey
и игнорируется.newObj
становится{ 2: 2, 3: 3, 4: 4 }
. Обратите внимание, что удаленный ключ не существует, значение не было просто установленоundefined
.источник
источник
Lodash опустить
источник
Вы также можете использовать оператор спреда, чтобы сделать это
источник
copy
const copy = { ...source, b: undefined }
сводится к точно так же.Решения, описанные выше с использованием структурирования, страдают от того, что у вас есть используемая переменная, которая может вызвать жалобы от ESLint, если вы ее используете.
Итак, вот мои решения:
На большинстве платформ (кроме IE, если не используется Babel), вы также можете сделать:
источник
Как насчет этого:
источник
Если вы имеете дело с огромной переменной, вы не хотите копировать ее, а затем удалять, поскольку это будет неэффективно.
Должен работать простой цикл for с проверкой hasOwnProperty, и он гораздо более адаптируем к будущим потребностям:
источник
Как насчет этого? Я никогда не встречал этот шаблон, но я просто пытался исключить одно или несколько свойств без необходимости создания дополнительного объекта. Это, кажется, делает работу, но есть некоторые побочные эффекты, которые я не могу видеть. Наверняка не очень читабельно.
источник
Я сделал это таким образом, как пример из моего редуктора Redux:
Другими словами:
источник
const { [removeMe]: removedKey, ...newObj } = obj;
- см. Мой ответ на этот вопрос.Я недавно сделал это очень простым способом:
просто используя оператор распространения, чтобы отделить нежелательное свойство:
... и object.assign, чтобы принять только часть отдыха:
источник
rest
это уже новый объект - вам не нужна последняя строка. Плюс, это идентично принятому решению.источник