removeDuplicates () accetta un array di oggetti e restituisce un nuovo array senza oggetti duplicati (basato sulla proprietà 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);
Risultato previsto:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
Innanzitutto, impostiamo il valore della variabile uniq su un oggetto vuoto.
Successivamente, filtriamo attraverso l'array di oggetti. Filter crea un nuovo array con tutti gli elementi che superano il test implementato dalla funzione fornita.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Sopra, utilizziamo la funzionalità di corto circuito di &&. Se il lato sinistro di && restituisce true, restituisce il valore a destra di &&. Se il lato sinistro è falso, restituisce ciò che si trova sul lato sinistro di &&.
Per ogni oggetto (obj) controlliamo uniq per una proprietà chiamata valore di obj.id (In questo caso, nella prima iterazione verificherebbe la proprietà '1'). Vogliamo l'opposto di ciò che restituisce (sia vero o false) che è il motivo per cui usiamo il! in! uniq [obj.id]. Se uniq ha già la proprietà id, restituisce true che restituisce false (!) Dicendo alla funzione filtro NOT di aggiungere quell'oggetto. Tuttavia, se non trova la proprietà obj.id, restituisce false che restituisce true (!) E restituisce tutto a destra di && o (uniq [obj.id] = true). Questo è un valore vero, che dice al metodo di filtro di aggiungere quell'oggetto all'array restituito e aggiunge anche la proprietà {1: true} a uniq. Ciò garantisce che qualsiasi altra istanza obj con lo stesso ID non verrà aggiunta di nuovo.