removeDuplicates () recebe uma matriz de objetos e retorna uma nova matriz sem nenhum objeto duplicado (com base na propriedade id).
const allTests = [
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'},
{name: 'Test2', id: '2'},
{name: 'Test3', id: '3'}
];
function removeDuplicates(array) {
let uniq = {};
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true))
}
removeDuplicates(allTests);
Resultado esperado:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
Primeiro, configuramos o valor da variável uniq para um objeto vazio.
Em seguida, filtramos a matriz de objetos. O filtro cria uma nova matriz com todos os elementos que passam no teste implementado pela função fornecida.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Acima, usamos a funcionalidade de curto-circuito do &&. Se o lado esquerdo do && for avaliado como true, ele retornará o valor à direita do &&. Se o lado esquerdo for falso, ele retornará o que está no lado esquerdo do &&.
Para cada objeto (obj), checamos uniq para uma propriedade denominada valor de obj.id (nesse caso, na primeira iteração, verificaria a propriedade '1'.) Queremos o oposto do que ele retorna (verdadeiro ou false) e é por isso que usamos o! in! uniq [obj.id]. Se o uniq já tiver a propriedade id, ele retornará true, que será falso (!), Dizendo à função de filtro NÃO para adicionar esse objeto. No entanto, se não encontrar a propriedade obj.id, retornará false, que será avaliado como true (!) E retornará tudo à direita de &&, ou (uniq [obj.id] = true). Este é um valor verdadeiro, dizendo ao método de filtro para adicionar esse obj à matriz retornada e também adiciona a propriedade {1: true} ao uniq. Isso garante que qualquer outra instância obj com o mesmo ID não seja adicionada novamente.