removeDuplicates () приймає масив об'єктів і повертає новий масив без жодних повторюваних об'єктів (на основі властивості 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);
Очікуваний результат:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
Спочатку встановлюємо значення змінної uniq порожньому об'єкту.
Далі ми проціджуємо масив об’єктів. Filter створює новий масив з усіма елементами, які проходять тест, реалізований наданою функцією.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Вище ми використовуємо функцію короткого замикання &&. Якщо ліва частина && оцінює значення true, то вона повертає значення праворуч від &&. Якщо ліва сторона помилкова, вона повертає те, що знаходиться в лівій частині &&.
Для кожного об'єкта (obj) ми перевіряємо uniq на властивість з назвою значення obj.id (У цьому випадку на першій ітерації він би перевіряв властивість '1'.) Ми хочемо навпаки тому, що він повертає або помилково) саме тому ми використовуємо! в! uniq [obj.id]. Якщо uniq вже має властивість id, він повертає true, який оцінює false (!), Кажучи функції фільтра NOT, щоб додати цей obj. Однак якщо він не знайде властивість obj.id, він поверне помилкове значення, яке потім оцінюється на true (!) І поверне все праворуч від &&, або (uniq [obj.id] = true). Це truthy значення, що говорить методу фільтра, щоб додати цей obj до повернутого масиву, а також додає властивість {1: true} до uniq. Це гарантує, що будь-який інший примірник об’єкта з тим самим ідентифікатором не буде доданий знову.