7

Как клонировать объект JavaScript, исключив один ключ?

1

У меня есть плоский объект на JavaScript:

{a: 1, b: 2, c: 3, ..., z: 26}

Я хочу создать его клон, исключив один элемент:

{a: 1, c: 3, ..., z: 26}

Какой самый простой способ сделать это (предпочтительно с использованием ES6/ES7)?

5 ответ(ов)

2

Вы можете использовать следующий однострочник ESNext, чтобы создать клон объекта, исключая определенные свойства, например, b и c:

const obj = { a: 1, b: 2, c: 3, d: 4 }
const clone = (({ b, c, ...o }) => o)(obj) // исключаем b и c
console.log(clone)

В этом коде мы используем деструктуризацию, чтобы извлечь свойства b и c, а затем применяем оператор остаточных свойств (...o), чтобы сохранить оставшиеся свойства в новом объекте o. В результате получаем объект, в котором отсутствуют свойства b и c. Вывод в консоль будет таким: { a: 1, d: 4 }.

2

Для создания клона объекта в JavaScript вы можете использовать метод Object.assign(). В вашем примере вы создаете новый объект, копируя свойства из исходного объекта {a: 1, b: 2, c: 3}, а затем удаляете свойство b из клона:

var clone = Object.assign({}, {a: 1, b: 2, c: 3});
delete clone.b;

В результате clone будет содержать {a: 1, c: 3}.

Если вы хотите, чтобы свойство b было установлено в undefined, вместо удаления, вы можете передать еще один объект со значением undefined в Object.assign():

var clone = Object.assign({}, {a: 1, b: 2, c: 3}, {b: undefined});

Таким образом, clone будет выглядеть как {a: 1, b: undefined, c: 3}.

Выбор между удалением свойства и установкой его в undefined зависит от ваших требований к объекту.

1

Если вы не можете использовать ES6, вы можете воспользоваться библиотеками lodash или underscore.

Пример использования lodash:

_.omit(x, 'b');

Также можно использовать ramda:

R.omit('b', x);

Эти методы позволяют исключить свойство b из объекта x.

0

Вот вариант для исключения динамических ключей, который, как мне кажется, еще не был упомянут:

const obj = { 1: 1, 2: 2, 3: 3, 4: 4 };
const removeMe = 1;

const { [removeMe]: removedKey, ...newObj } = obj;

При этом removeMe указывается как removedKey и игнорируется. В результате newObj становится равным { 2: 2, 3: 3, 4: 4 }. Обратите внимание, что удаляемый ключ действительно отсутствует в новом объекте, значение не просто установлено в undefined.

0

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

var copy = Object.assign({}, {a: 1, b: 2, c: 3});
delete copy.c;

После выполнения этой последовательности у вас будет объект copy, который изначально содержит свойства a, b и c. Однако, после вызова delete copy.c, свойство c будет удалено, и в результате ваш объект copy будет содержать только a и b.

Теперь о вашем вопросе: c действительно копируется в copy, когда вы используете Object.assign(). Однако, если вы затем удаляете c, то его больше не будет в объекте copy.

Таким образом, да, этот код хорош для создания копии объекта, и вы можете удалить свойства, которые вам не нужны. Если вам нужно создать новую копию объекта без определённых свойств, то можно использовать такой подход. Если вам нужно более глубокое копирование (недоступное через Object.assign()), то следует использовать другие методы, такие как JSON.parse(JSON.stringify(obj)) или сторонние библиотеки, такие как Lodash.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь