removeDuplicates () przyjmuje tablicę obiektów i zwraca nową tablicę bez żadnych zduplikowanych obiektów (na podstawie właściwości 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);
Spodziewany rezultat:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
Najpierw ustawiamy wartość zmiennej uniq na pusty obiekt.
Następnie filtrujemy przez tablicę obiektów. Filtr tworzy nową tablicę ze wszystkimi elementami, które pomyślnie przejdą test zaimplementowany przez podaną funkcję.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Powyżej korzystamy z funkcji zwierania &&. Jeśli lewa strona && ma wartość true, to zwraca wartość po prawej stronie &&. Jeśli lewa strona jest fałszywa, zwraca to, co znajduje się po lewej stronie &&.
Dla każdego obiektu (obj) sprawdzamy uniq pod kątem właściwości o nazwie obj.id (W tym przypadku przy pierwszej iteracji sprawdzałby właściwość „1”). Chcemy, aby było odwrotnie niż to, co zwraca (prawda lub false), dlatego używamy! w! uniq [obj.id]. Jeśli uniq ma już właściwość id, zwraca true, co daje wartość false (!), Informując funkcję filtrującą, aby NIE dodawała tego obj. Jeśli jednak nie znajdzie właściwości obj.id, zwraca false, która następnie zwraca wartość true (!) I zwraca wszystko po prawej stronie && lub (uniq [obj.id] = true). Jest to prawdziwa wartość, która mówi metodzie filter, aby dodała ten obiekt do zwracanej tablicy, a także dodaje właściwość {1: true} do uniq. Dzięki temu żadna inna instancja obj o tym samym identyfikatorze nie zostanie dodana ponownie.