Вы можете взять Map
и вернуться в исходном порядке.
Карта принимает элементы в порядке следования, что означает, что все элементы находятся позже в исходном порядке. Если ключ существует, он создает массив со значением. В противном случае в качестве значения для карты берется только элемент из массива.
В конце берут только значения из карты и создают его массив.
let input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20],
result = Array.from(input
.reduce((m, v) => m.set(v, m.has(v) ? [].concat(m.get(v), v) : v), new Map)
.values()
);
console.log(result);
Более традиционный подход
let input = [1, 2, 4, 591, 392, 391, 2, 5, 10, 2, 1, 1, 1, 20, 20],
result = input
.sort((a, b) => a -b)
.reduce((r, v, i, a) => {
if (a[i - 1] !== v && v !== a[i + 1]) r.push(v); // check if unique
else if (a[i - 1] !== v) r.push([v]); // check left element
else r[r.length - 1].push(v);
return r;
}, []);
console.log(result);