Как проверить всю вложенность массива объектов на дубликаты?

Для проверки всей вложенности массива объектов на дубликаты в JavaScript вам потребуется пройтись по каждому объекту и проверить его наличие во вложенных объектах.

Существует несколько подходов к решению этой задачи. Ниже рассмотрены два из них.

1. Используя циклы:

function checkDuplicates(arr) {
  // Создание объекта для отслеживания существующих объектов
  var cache = {};
  
  // Перебор каждого объекта в массиве
  for (var i = 0; i < arr.length; i++) {
    var currentObject = arr[i];
  
    // Проверка, содержится ли текущий объект в кэше
    if (cache[JSON.stringify(currentObject)]) {
      return true; // Дубликат найден
    }
  
    // Сохранение текущего объекта в кэше
    cache[JSON.stringify(currentObject)] = true;
  
    // Проверка, имеет ли текущий объект вложенные объекты,
    // и рекурсивный вызов для проверки дубликатов во вложенности
    for (var prop in currentObject) {
      if (typeof currentObject[prop] === 'object' && currentObject[prop] !== null) {
        if (checkDuplicates([currentObject[prop]])) {
          return true; // Дубликат найден
        }
      }
    }
  }
  
  return false; // Дубликат не найден
}

// Пример использования:
var arrayOfObjects = [
  { name: 'John', age: 25 },
  { name: 'Alex', age: 30 },
  { name: 'John', age: 25 }
];

console.log(checkDuplicates(arrayOfObjects)); // true

Данный подход использует объект cache для отслеживания уже пройденных объектов. Если текущий объект уже находится в кэше, то это означает, что мы нашли дубликат. Затем проверяется наличие вложенных объектов для каждого свойства текущего объекта и вызывается рекурсивная проверка для них.

2. Используя рекурсию и Set:

function checkDuplicates(arr) {
  // Создание нового Set и добавление каждого объекта массива в него
  var set = new Set(arr);
  
  // Проверка размера Set перед и после добавления всех объектов
  // Если размер изменяется, значит, в массиве присутствуют дубликаты
  if (set.size !== arr.length) {
    return true; // Дубликат найден
  }
  
  // Проверка вложенных объектов для каждого объекта в массиве
  for (var i = 0; i < arr.length; i++) {
    for (var prop in arr[i]) {
      if (typeof arr[i][prop] === 'object' && arr[i][prop] !== null) {
        if (checkDuplicates([arr[i][prop]])) {
          return true; // Дубликат найден
        }
      }
    }
  }
  
  return false; // Дубликат не найден
}

// Пример использования:
var arrayOfObjects = [
  { name: 'John', age: 25 },
  { name: 'Alex', age: 30 },
  { name: 'John', age: 25 }
];

console.log(checkDuplicates(arrayOfObjects)); // true

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