@CreativeStory

Как найти уникальный элемент в массиве?

Есть массив с одним уникальным значением

var opis = ["tseremonii", "tseremonii", "fotografy", "fotografy", "mesto-provedeniya", "makiyazh-i-pricheska", "makiyazh-i-pricheska"]

Как можно на чистом JS найти это уникальное значение?
В данном массиве результатом должно быть значение: mesto-provedeniya
Только оно не имеет изначально дублей.
  • Вопрос задан
  • 12764 просмотра
Решения вопроса 7
@ReactLover
opis.filter((el, i, arr) => arr.indexOf(el) === arr.lastIndexOf(el))
Ответ написан
Комментировать
@iGanza
function uniq (arr) {
  const store = arr.reduce((acc, cur) => {
    !acc[cur] ? acc[cur] = 1 : acc[cur]++
    return acc
  }, {})
  return Object.keys(store).filter(key => store[key] === 1)
}
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега JavaScript
♬♬
Составить словарь, где строке соответствует число её упоминаний в массиве.
Затем из него взять только те ключи, для которых число упоминаний == 1.
const counts = opis.reduce((p,c) => { p[c] = p[c] ? p[c]+1 : 1; return p;}, {});
const result = [];
for (let k in counts) if (counts[k] === 1) result.push(k);
Ответ написан
Комментировать
filgaponenko
@filgaponenko
frontend developer
function unique(value, index, self) {
  return self.filter((item) => item === value).length === 1;
}

opis.filter(unique);
// ["mesto-provedeniya"]
Ответ написан
Комментировать
0xD34F
@0xD34F Куратор тега JavaScript
const getUnique = arr => Array
  .from(arr.reduce((acc, n) => acc.set(n, acc.has(n)), new Map))
  .reduce((acc, n) => (n[1] || acc.push(n[0]), acc), []);


const result = getUnique(arr);

или

const getByCount = (arr, checkCount) => Array
  .from(arr.reduce((acc, n) => acc.set(n, -~acc.get(n)), new Map))
  .reduce((acc, n) => (checkCount(n[1]) && acc.push(n[0]), acc), []);


const result = getByCount(arr, count => !~-count);
Ответ написан
Комментировать
@CreativeStory Автор вопроса
Сам спросил, сам ответил, вот решение задачи
function getUniqueElems(A)   // A - упорядоченный массив.
{   
    var n = A.length, B = [];
    for (var i = 1, j = 0, t; i < n+1; i++)
     { if (A[i-1] === A[ i ]) t = A[i-1];
       if (A[i-1] !== t) B[j++] = A[i-1];
     }
                    // На выходе массив только с теми элементами входного 
    return B;       //  упорядоченного массива, которые не имеют дубли.
}
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
unique = opis.filter(a=>opis.filter(b=>b===a).length==1)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
alex_keysi
@alex_keysi
Помог с решением? Отметь “правильный ответ”
Я бы лучше как нибудь переделал это в Массив объектов с полем count и type. Иначе потом будет сложно читать код.
Ответ написан
@Anarchist
Побитовый xor байтовых представлений строк даст в точности искомый результат. Линейное время, константная память.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы