Немного отличается от других ответов:
const extractSubs = myObjects =>
Object .values (myObjects .reduce (
(a, {name, subs}) => subs .reduce (
(a, {title}) => ({... a, [title]: {title, objects: [...((a [title] && a[title].objects) || []), name]}}),
a
),
{}
))
const myObjects = [{id: '1', name: 'name1', subs: [{id: '1', title: 'subName1'}, {id: '2', title: 'subName2'}]}, {id: '2', name: 'name2', subs: [{id: '2', title: 'subName2'}, {id: '3', title: 'subName3'}]}]
console .log (extractSubs (myObjects))
.as-console-wrapper {max-height: 100% !important; top: 0;}
Как всегда, я предпочитаю заключать такие преобразования в функции. И я предпочитаю не изменять данные больше, чем необходимо. Это, вероятно, менее эффективно, чем другие методы, но я бы остановился на этом простом подходе, если только тестирование не определило, что это было узким местом в моем приложении.