Как отсортировать объекты по массивам в JS

есть массив объктов:

[

 {category:1, product: 1},

 {category:1, product: 2},

 {category:1, product: 3},

 {category:2, product: 4},

 {category:2, product: 5},

 {category:3, product: 6},

 {category:4, product: 7}

]

нужно отсортировать массив по котегориям так чтобы на выходе был:

[
  [
    {category:1, product: 1},

    {category:1, product: 2},

    {category:1, product: 3}
  ],

  [
   {category:2, product: 4},

   {category:2, product: 5},
  ],
  [
   {category:3, product: 6},
  ],
  [
   {category:4, product: 7}
  ]
] 

сортировать нужно по категориям и массивы должны быть динамическими. никак не пойму как решить, попытался отсортировать по возростанию числа категорий, потом найти первый и последний индекс определённых категорий и при помощ slice() отрезать нужные объекты, но такой способ думаю не оптимальный

Правильно ли я понимаю, что нужно:

  1. Сгруппировать продукты по категориям
  2. Внутри каждой категории продукты тоже должны быть отсортированы по какому-то признаку?
  3. В любой момент может прийти еще один-два-десять продуктов и они должны быть динамически добавлены в отсортированный массив?

А также: что мы знаем о номерах категорий? Это всегда числа по порядку от 1 до n? Или это могут быть строки, типо category: "first"?

  1. продукты с одинаковыми категориями должны быть в одном массиве
  2. числа могут быть произвольные, но только числа
  3. да, нужно допускать вариант что будут добавлены ещё товары

Самый простой вариант - сделать что-нибудь такое:

const input = [
	{category:1, product: 1},
	{category:1, product: 2},
	{category:1, product: 3},
	{category:10, product: 4},
	{category:2, product: 5},
	{category:3, product: 6},
	{category:4, product: 7},
	{category:500, product: 7}
];

const result = [];

input.forEach(obj => {
	const id = obj.category;
	const currentCategory = result[id] || [];

	currentCategory.push(obj);
	result[id] = currentCategory;
});

Но это не слишком эффективно, потому что при итерации, например, через for(... of) он выдаст все элементы, даже там, где пробелы (в примере выше - их будет 500).

Можно фильтровать после каждого добавления:

result.filter(el => !!el)

Но опять же, не сильно эффективно.
Если объектов много, и операций добавления-удаления тоже много, то можно посмотреть в сторону какого-нибудь Priority Queue, но это будет уже не массив с массивами :)

Если ты знаешь, как эта структура будет использоваться, можно посмотреть, как можно оптимизировать.