Вы можете получить все значения, которые появляются один раз, используя карту, чтобы подсчитать, сколько раз появился каждый элемент. Затем вы можете уменьшить эту карту до массива уникальных значений:
const findUnique = arr => {
const mapEntries = [...arr.reduce((a, v) => a.set(v, (a.get(v) || 0) + 1), new Map()).entries()]
return mapEntries.reduce((a, v) => (v[1] === 1 && a.push(v[0]), a), [])
}
console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([1, 2, 3, 2, 4]))
console.log(findUnique([4, 10, 4, 5, 3]))
Если вы не заботитесь о нескольких уникальных значениях, вы можете просто отсортировать массив и использовать логику вместо проверки каждого значения, при условии, что массив содержит только 2 различных значенияи имеет длину более 2:
const findUnique = arr => {
a = arr.sort((a, b) => a - b)
if (arr.length < 3 || new Set(a).size === 1) return null
return a[0] === a[1] ? a[a.length-1] : a[0]
}
console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([3, 3, 1]))
console.log(findUnique([3, 1]))
console.log(findUnique([3, 3, 3, 3, 3]))