Как массив объектов собрать в один объект, объединив одноимённые свойства в массивы?

Для того чтобы объединить свойства одноименных объектов в массивы в JavaScript, необходимо выполнить следующие шаги:

1. Создайте пустой объект, в который будет собран новый объект с объединенными свойствами.

2. Сделайте итерацию по массиву объектов с помощью цикла for или метода forEach().

3. В каждой итерации, проверьте, существует ли уже объект с таким же именем в новом объединенном объекте. Если объект не существует, создайте его и присвойте значение текущего объекта с текущей итерации.

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

5. После завершения итераций, новый объединенный объект будет содержать одноименные свойства объединенных объектов в виде массивов.

Пример кода:

// Массив объектов
let objectsArray = [
  { name: "John", age: 25 },
  { name: "Alice", age: 30 },
  { name: "John", age: 35 },
  { name: "Bob", age: 40 }
];

// Пустой объединенный объект
let combinedObject = {};

// Итерация по массиву объектов
objectsArray.forEach(obj => {
  // Проверка существования объекта с таким же именем в объединенном объекте
  if (combinedObject.hasOwnProperty(obj.name)) {
    // Проверка каждого свойства текущего объекта
    for (let prop in obj) {
      if (combinedObject[obj.name].hasOwnProperty(prop)) {
        // Добавление нового значения в массив, если свойство уже является массивом
        if (Array.isArray(combinedObject[obj.name][prop])) {
          combinedObject[obj.name][prop].push(obj[prop]);
        } else {
          // Создание массива и добавление старого и нового значения, если свойство не является массивом
          combinedObject[obj.name][prop] = [combinedObject[obj.name][prop], obj[prop]];
        }
      } else {
        // Присвоение значения свойству, если оно отсутствует в объединенном объекте
        combinedObject[obj.name][prop] = obj[prop];
      }
    }
  } else {
    // Создание нового объекта с текущим именем, если такого объекта нет в объединенном объекте
    combinedObject[obj.name] = Object.assign({}, obj);
  }
});

console.log(combinedObject);

В результате выполнения этого кода, вы увидите следующий результат в консоли:

{
  John: {
    name: ["John", "John"],
    age: [25, 35]
  },
  Alice: {
    name: "Alice",
    age: 30
  },
  Bob: {
    name: "Bob",
    age: 40
  }
}

Таким образом, свойства одноименных объектов объединены в массивы в новом объединенном объекте.