Как можно сгруппировать объекты по общему свойству, если такое есть?

У меня приходит масив с объектами:

   const arr = [
  {
    prop1: 'test-1',
    propText: 'test'
  },
  {
    prop1: 'test-2',
    propText: 'test'
  },
  {
    prop1: 'test-3',
    propText: 'test'
  },
  {
    prop1: 'test-4',
    propText: 'test'
  },
  {
    prop1: 'test-5',
    propText: 'test'
  },
  {
    prop1: 'test-6'
  },
  {
    prop1: 'test-7'
  },
  {
    prop1: 'test-8'
  },
  {
    prop1: 'test-9',
    propText: 'test 2'
  },
  {
    prop1: 'test-10',
    propText: 'test 2'
  }
]

Как можно его промапить что бы получить на выходе объект с сгруппированными объектами по общему свойству и с сохранением порядка, если такое свойство null/undefined то возвращать просто объект :

 const resultObj = {
  test: {
    1: {
      prop1: 'test-1',
      propText: 'test'
    },
    2: {
      prop1: 'test-2',
      propText: 'test'
    },
    3: {
      prop1: 'test-3',
      propText: 'test'
    },
    4: {
      prop1: 'test-4',
      propText: 'test'
    },
    5: {
      prop1: 'test-5',
      propText: 'test'
    }
  },
  6: {
    prop1: 'test-6'
  },
  7: {
    prop1: 'test-7'
  },
  8: {
    prop1: 'test-8'
  },
  test2: {
    9: {
      prop1: 'test-9',
      propText: 'test2'
    },
    10: {
      prop1: 'test-10',
      propText: 'test2'
    }
  }
}

Я проюовал группировать через reduce, но не получаеться возвращать объект если его не нужно группировать:

   arr.reduce((objectsByKeyValue, obj) => {
    const value = obj['propText'];
    if(value) {
      objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj);

  }, {});

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

Автор решения: vp_arth

Ключи объекта никогда не гарантировали порядок. Это unsorted hashmap.
Так что сохранить порядок, не меняя структуры не выйдет.

const arr = [{prop1: 'test-1', propText: 'test'}, {prop1: 'test-2', propText: 'test'}, {prop1: 'test-3', propText: 'test'}, {prop1: 'test-4', propText: 'test'}, {prop1: 'test-5', propText: 'test'}, {prop1: 'test-6'}, {prop1: 'test-7'}, {prop1: 'test-8'}, {prop1: 'test-9', propText: 'test 2'}, {prop1: 'test-10', propText: 'test 2'} ];

let id = 0;
const res = arr.reduce((acc, el) => {
  if (el.propText) {
    if (!acc[el.propText]) acc[el.propText] = {};
    acc[el.propText][++id] = el;
  } else {
    acc[++id] = el;
  }
  return acc;
}, {});

console.log(res);

→ Ссылка