Эффективные методы условного помещения объектов в другие объекты в JavaScript

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

Метод 1: сравнение ссылок на объекты
Один простой способ определить, изменился ли объект, — это сравнить его ссылку с существующим объектом. Если ссылки разные, объект изменился. Вот пример:

function pushIfChanged(obj, targetArr) {
  if (targetArr.indexOf(obj) === -1) {
    targetArr.push(obj);
  }
}
const existingObject = { name: "John", age: 25 };
const newObject = { name: "John", age: 25 };
pushIfChanged(newObject, existingObject); // Object not pushed
console.log(existingObject); // Output: { name: "John", age: 25 }
const modifiedObject = { name: "John", age: 30 };
pushIfChanged(modifiedObject, existingObject); // Object pushed
console.log(existingObject); // Output: { name: "John", age: 25 }, { name: "John", age: 30 }

Метод 2: глубокое сравнение на равенство
Если вы хотите сравнить содержимое объектов, а не их ссылки, вы можете выполнить глубокое сравнение на равенство. Одна популярная библиотека для глубокой проверки равенства — lodash. Вот пример использования метода isEquallodash:

const _ = require("lodash");
function pushIfChanged(obj, targetArr) {
  if (!targetArr.some((item) => _.isEqual(item, obj))) {
    targetArr.push(obj);
  }
}
const existingObjects = [{ name: "John", age: 25 }];
const newObject = { name: "John", age: 25 };
pushIfChanged(newObject, existingObjects); // Object not pushed
console.log(existingObjects); // Output: [{ name: "John", age: 25 }]
const modifiedObject = { name: "John", age: 30 };
pushIfChanged(modifiedObject, existingObjects); // Object pushed
console.log(existingObjects); // Output: [{ name: "John", age: 25 }, { name: "John", age: 30 }]

Метод 3: пользовательская функция сравнения
Если у вас есть определенные критерии для определения того, изменился ли объект, вы можете определить пользовательскую функцию сравнения. Вот пример сравнения объектов по определенному свойству:

function pushIfChanged(obj, targetArr) {
  if (!targetArr.some((item) => item.name === obj.name)) {
    targetArr.push(obj);
  }
}
const existingObjects = [{ name: "John", age: 25 }];
const newObject = { name: "John", age: 25 };
pushIfChanged(newObject, existingObjects); // Object not pushed
console.log(existingObjects); // Output: [{ name: "John", age: 25 }]
const modifiedObject = { name: "John", age: 30 };
pushIfChanged(modifiedObject, existingObjects); // Object pushed
console.log(existingObjects); // Output: [{ name: "John", age: 25 }, { name: "John", age: 30 }]

Реализуя эти методы, вы можете выборочно помещать объекты в другие объекты только тогда, когда они изменились. Независимо от того, предпочитаете ли вы сравнивать ссылки, выполнять глубокие проверки на равенство или определять собственные функции сравнения, эти подходы обеспечивают гибкость для различных вариантов использования JavaScript.

Не забудьте проанализировать свои конкретные требования и выбрать метод, который лучше всего соответствует вашим потребностям.