После этих слов, дальнейшие Ваши комментарии не стоят внимания. О-большое измеряет не сложность, а скорость.
какая сложность у такого редюса ?
[1,1,2,3,4,5,5,6,6,6,6,6,4,1,6,7].reduce((acc, item, i, arr) => { if (acc.has(item)) return acc; let idx = arr.indexOf(item); let lastIdx = arr.lastIndexOf(item); if (idx === lastIdx) { acc.add(item); }; return acc; }, new Set());
Про Object.assign знаюи чем он не угодил? Уж точно лучше тормознутого for-in, который у Вас кстати без проверки на собственные свойства...
Ну и по той же причине с data у Вас так работать не получится