Иногда в каждый день программирования вы получаете массив объектов, которые не являются уникальными 😰.

У вас есть массив объектов, некоторые из которых являются дубликатами, но с разными свойствами объекта, и вы хотите получить только один объект со всеми те свойства.

In JavaScript:

  • Объекты используются для хранения коллекций с ключами.
  • Массивы используются для хранения упорядоченных коллекций.

Давайте посмотрим на настоящую проблему с кодом:

[
    {
        label: "Book1",
        data: "US edition"
    },
    {
        label: "Book1",
        title: "UK edition"
    },
    {
        label: "Book1",
        date: "12.2.2020"
    },
    {
        label: "Book2",
        data: "CAN edition"
    },
    {
        label: "Book2",
        title: "test edition"
    }
];

Вы хотите видеть такие данные:

[
    {
        label: "Book1",
        data: "US edition",
        title: "UK edition",
        date: "12.2.2020",
        etc: "etc..."
    },
    {
        label: "Book2",
        data: "CAN edition",
        title: "test edition"
    }
];

Во-первых, давайте посмотрим, какую структуру данных мы можем использовать, чтобы помочь нам в реализации этого подхода, например мы можем использовать Map 🤩.

Карта - это набор элементов данных с ключами, как и Object. Но главное отличие в том, что Map позволяет использовать ключи любого типа.

Если свойство вашего объекта любого типа, оно будет работать с Map: D.

Во-первых, подумайте о создании интерфейса для вашего объекта:

class: IBook {
label: string;
data: string;
title: string;
date: Date;
etc: Etc;
}

Функция javascript будет такой:

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

Функция будет работать с любым типом объекта в массиве.

Вызвать эту функцию очень просто:

mergeObjectsInUnique(myArrayWithDuplicates, 'propertyThatIWantToGroupBy');

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