Как объединить свойства двух JavaScript объектов?
Мне нужно уметь объединять два простых JavaScript объекта во время выполнения. Например:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 теперь имеет три свойства: food, car, и animal
Существует ли встроенный способ сделать это? Мне не нужна рекурсия, и мне не нужно объединять функции, только свойства плоских объектов.
Самый простой способ объединить свойства двух JavaScript объектов - использовать встроенный метод Object.assign() или современный оператор spread (...). Для вашего конкретного случая, когда вы хотите добавить метод merge() к объектам, вы можете либо использовать эти методы напрямую, либо создать пользовательскую функцию слияния.
Содержание
- Использование Object.assign()
- Использование оператора spread
- Добавление пользовательского метода merge()
- Ключевые различия и когда использовать каждый метод
- Обработка конфликтов свойств
- Рассмотрения производительности
Использование Object.assign()
Метод Object.assign() - это наиболее распространенный встроенный способ объединения объектов в JavaScript. Он копирует все перечисляемые собственные свойства из одного или нескольких исходных объектов в целевой объект и возвращает измененный целевой объект.
var obj1 = { food: 'pizza', car: 'ford' };
var obj2 = { animal: 'dog' };
// Объединяем obj2 с obj1
Object.assign(obj1, obj2);
console.log(obj1); // { food: 'pizza', car: 'ford', animal: 'dog' }
Синтаксис: Object.assign(целевой_объект, ...исходные_объекты)
Вы также можете объединить несколько объектов одновременно:
var obj1 = { a: 1 };
var obj2 = { b: 2 };
var obj3 = { c: 3 };
Object.assign(obj1, obj2, obj3);
// obj1 теперь имеет свойства: a: 1, b: 2, c: 3
Согласно Mozilla Developer Network, “Метод Object.assign() статический копирует все перечисляемые собственные свойства из одного или нескольких исходных объектов в целевой объект. Он возвращает измененный целевой объект.”
Использование оператора spread
Оператор spread (...), представленный в ES6, предоставляет более лаконичный способ объединения объектов:
var obj1 = { food: 'pizza', car: 'ford' };
var obj2 = { animal: 'dog' };
// Создаем новый объединенный объект
var mergedObj = { ...obj1, ...obj2 };
console.log(mergedObj); // { food: 'pizza', car: 'ford', animal: 'dog' }
Этот подход создает совершенно новый объект, не изменяя исходные объекты. Как отмечено в исследовании от SitePoint, “Объединенный объект будет содержать все свойства и методы из исходных объектов, независимо от их типов данных.”
Добавление пользовательского метода merge()
Поскольку вы хотите вызывать obj1.merge(obj2), вы можете расширить прототип Object пользовательским методом merge. Вот как это сделать:
// Добавляем метод merge к прототипу Object
Object.prototype.merge = function(source) {
return Object.assign(this, source);
};
// Теперь вы можете использовать его так, как хотели
var obj1 = { food: 'pizza', car: 'ford' };
var obj2 = { animal: 'dog' };
obj1.merge(obj2);
console.log(obj1); // { food: 'pizza', car: 'ford', animal: 'dog' }
Альтернативно, если вы предпочитаете не изменять прототип Object, вы можете создать утилитарную функцию:
function merge(target, source) {
return Object.assign(target, source);
}
// Использование
var obj1 = { food: 'pizza', car: 'ford' };
var obj2 = { animal: 'dog' };
merge(obj1, obj2);
console.log(obj1); // { food: 'pizza', car: 'ford', animal: 'dog' }
Ключевые различия и когда использовать каждый метод
Вот сравнение основных методов:
| Метод | Синтаксис | Изменяет целевой объект | Возвращает новый объект | Лучше всего подходит для |
|---|---|---|---|---|
Object.assign() |
Object.assign(целевой, исходный) |
Да | Нет | Объединение на месте, критичный к производительности код |
| Оператор spread | {...obj1, ...obj2} |
Нет | Да | Неизменяемые операции, современный код ES6+ |
| Пользовательский merge | obj1.merge(obj2) |
Да | Нет | Удобство, объектно-ориентированный подход |
Как упоминается в исследовании от Stack Overflow, “Object.assign(obj1, obj2); может быть предпочтительным способом, так как let merged = {...obj1, ...obj2}; создает новый объект и копирует свойства obj1 и obj2 в него, что может быть очень затратным для больших объектов.”
Обработка конфликтов свойств
Когда оба объекта имеют свойства с одинаковыми именами, свойства более позднего объекта перезаписывают более ранние:
var obj1 = { name: 'John', age: 25 };
var obj2 = { name: 'Jane', city: 'New York' };
// Использование Object.assign
Object.assign(obj1, obj2);
console.log(obj1.name); // 'Jane' (значение из obj2 перезаписывает значение из obj1)
// Использование оператора spread
var merged = { ...obj1, ...obj2 };
console.log(merged.name); // 'Jane'
Документация от GeeksforGeeks подтверждает, что “если есть несколько ключей, то объединенные значения будут перезаписаны слева направо в порядке параметров.”
Рассмотрения производительности
Для приложений, критичных к производительности, с большими объектами, Object.assign() обычно более эффективен, чем оператор spread, поскольку он не создает промежуточный объект. Однако для большинства случаев использования с объектами небольшого и среднего размера разница незначительна.
В исследовании от JavaScript Tutorial отмечается, что “метод Object.assign() позволяет копировать все перечисляемые собственные свойства из одного или нескольких исходных объектов в целевой объект и возвращать целевой объект.”
Заключение
- Используйте
Object.assign()для наиболее простого встроенного метода объединения объектов на месте - Используйте оператор spread, когда вам нужно создать новый объединенный объект без изменения исходных
- Создайте пользовательский метод merge, если вам предпочитаете синтаксис
obj1.merge(obj2)для удобства - Будьте внимательны к конфликтам свойств - более поздние объекты перезаписывают более ранние с одинаковыми именами свойств
- Учитывайте производительность -
Object.assign()обычно более эффективен для больших объектов
Для вашего конкретного случая использования с плоскими объектами любой из этих методов будет работать хорошо. Подход с Object.assign() является наиболее традиционным и широко поддерживаемым, в то время как оператор spread предлагает более современный синтаксис и неизменяемость.
Источники
- Object.assign() - JavaScript | MDN
- How to Merge Objects in JavaScript — SitePoint
- How can I merge properties of two JavaScript objects? - Stack Overflow
- JavaScript Object.assign() - Programiz
- How to Merge Objects in JavaScript - JavaScript Tutorial
- JavaScript Object.assign() Method - GeeksforGeeks
- ES6 Merge Objects - GeeksforGeeks