Если тупо получать то, что указано в тексте вопроса, тогда
const result = Object
.entries(arr.reduce((acc, n) => ((acc[n.name] ??= []).push(n.value), acc), {}))
.reduce((acc, [ k, v ]) => (acc[k] = v.length === 1 || v, acc), {});
Но почему
ThirdName: true
??
В самом деле так и надо, или всё-таки там должна быть строка с датой из исходного массива? А что если значения повторяются? Вот вариант с получением только уникальных значений и без дурацкого
true
там, где значение одно:
const result = Object
.entries(arr.reduce((acc, n) => ((acc[n.name] ??= new Set).add(n.value), acc), {}))
.reduce((acc, [ k, [...v] ]) => (acc[k] = ~-v.length ? v : v[0], acc), {});