как правильно сформировать массив по определенным ключам JS

У меня есть массив.

        [
        {
            headerName: 'name1', 
            field: 'name1',
            id = 1
        },
        {
            headerName: 'name2', 
            field: 'name2',
            id = 2
        },
        {
            headerName: 'name3', 
            field: 'name3',
            id = 2
        },
        {
            headerName: 'name4', 
            field: 'name4',
            id = 1
        },
        {
            headerName: 'name5', 
            field: 'name5',
            id = 2
        }
    ]

Определенно у меня встречаются одинаковый ключ id, как можно сгруппировать по id, в результате получив несколько массивов в зависимости от количества разных id

        [
            {
                headerName: 'name1', 
                field: 'name1',
                id = 1
            },{
                headerName: 'name4', 
                field: 'name4',
                id = 1
            }
        ],
        [
            {
                headerName: 'name2', 
                field: 'name2',
                id = 2
            },
            {
                headerName: 'name3', 
                field: 'name3',
                id = 2
            },
            
            {
                headerName: 'name5', 
                field: 'name5',
                id = 2
            }
        ]

Пробую реализовать через reduce, получается полная неразбериха, уже запутался.

const result = arr.reduce((acc, obj) => { 
          let index = acc.findIndex((elm) => {return elm.id == obj.id});
          if(index == -1){ return acc.concat(Object.assign({}, obj) };   
           return acc 
        }, [])

Ответы (4 шт):

Автор решения: ΝNL993

Что-то типа такого?:

const input = [
  {
      headerName: 'name1', 
      field: 'name1',
      id: 1
  },
  {
      headerName: 'name2', 
      field: 'name2',
      id: 2
  },
  {
      headerName: 'name3', 
      field: 'name3',
      id: 2
  },
  {
      headerName: 'name4', 
      field: 'name4',
      id: 1
  },
  {
      headerName: 'name5', 
      field: 'name5',
      id: 2
  }
]

function sortById(arr) {
  let output = []
  
  for (let e of arr) {
    if(output.some(r => r[0].id === e.id)) {
      output.filter(r => r[0].id === e.id)[0].push(e)
    } else {
      output.push([e])
    }
  }
  
  return output
}

console.log(sortById(input))

→ Ссылка
Автор решения: Ein

let arr = [
    {
        headerName: 'name1', 
        field: 'name1',
        id: 1
    },
    {
        headerName: 'name2', 
        field: 'name2',
        id: 2
    },
    {
        headerName: 'name3', 
        field: 'name3',
        id: 2
    },
    {
        headerName: 'name4', 
        field: 'name4',
        id: 1
    },
    {
        headerName: 'name5', 
        field: 'name5',
        id: 2
    }
];

let result = arr.reduce((all, el) => {
    // проверяем есть ли в объекте массив под нужым id
    // если нет, кладём пустой массив
    all[el.id] = all[el.id] || [];
    // кладём элемент в массив
    all[el.id].push(el);

    return all;
}, {});

// достаём из объекта масивы с элементами
result = Object.values(result);

console.log(result);

→ Ссылка
Автор решения: Dmitry Kozlov

Сначала преобразуем в объект, где ключами будет id, потом объект преобразуем в массив, перебирая ключи

const sourceArray = [
        {
            headerName: 'name1', 
            field: 'name1',
            id: 1
        },
        {
            headerName: 'name2', 
            field: 'name2',
            id: 2
        },
        {
            headerName: 'name3', 
            field: 'name3',
            id: 2
        },
        {
            headerName: 'name4', 
            field: 'name4',
            id: 1
        },
        {
            headerName: 'name5', 
            field: 'name5',
            id: 2
        }
    ];
 
 // Преобразуем в объект, группируя по id
 const destinationObject = {}
 sourceArray.forEach((entry) => {
     if (!destinationObject[entry.id]) {
         destinationObject[entry.id] = [];
     }
     destinationObject[entry.id].push(entry);
 });
 
 console.log(destinationObject);
 
 // Получаем массив сгруппированных записей
 const destinationArray = [];
 Object.keys(destinationObject).forEach((key) => {
     destinationArray.push(destinationObject[key]);
 });
 console.log(destinationArray);

→ Ссылка
Автор решения: Sergey Glazirin

Можно преобразовать массив так

const arr = [{
    headerName: 'name1',
    field: 'name1',
    id: 1
  },
  {
    headerName: 'name2',
    field: 'name2',
    id: 2
  },
  {
    headerName: 'name3',
    field: 'name3',
    id: 2
  },
  {
    headerName: 'name4',
    field: 'name4',
    id: 1
  },
  {
    headerName: 'name5',
    field: 'name5',
    id: 2
  }
];

// получаем список уникальных id
const idArray = [...new Set(arr.map(item => item.id))];

// через метод map() преобразуем элементы массива в отфильтрованные по этому элементу массив
const result = idArray.map(id => arr.filter(item => item.id === id));

console.log(result);

→ Ссылка