removeD repeatates () nhận một mảng các đối tượng và trả về một mảng mới mà không có bất kỳ đối tượng trùng lặp nào (dựa trên thuộc tính 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);
Kết quả dự kiến:
[
{name: 'Test1', id: '1'},
{name: 'Test3', id: '3'},
{name: 'Test2', id: '2'}
];
Đầu tiên, chúng ta đặt giá trị của biến uniq thành một đối tượng trống.
Tiếp theo, chúng tôi lọc qua mảng các đối tượng. Bộ lọc tạo ra một mảng mới với tất cả các yếu tố vượt qua bài kiểm tra được thực hiện bởi hàm được cung cấp.
return array.filter(obj => !uniq[obj.id] && (uniq[obj.id] = true));
Ở trên, chúng tôi sử dụng chức năng ngắn mạch của &&. Nếu bên trái của && ước tính là đúng, thì nó sẽ trả về giá trị ở bên phải của &&. Nếu bên trái là sai, nó sẽ trả về những gì ở bên trái của &&.
Đối với mỗi đối tượng (obj), chúng tôi kiểm tra uniq cho một thuộc tính có tên là giá trị của obj.id (Trong trường hợp này, trong lần lặp đầu tiên, nó sẽ kiểm tra thuộc tính '1'.) Chúng tôi muốn ngược lại với những gì nó trả về (đúng hoặc sai) đó là lý do tại sao chúng tôi sử dụng! trong! uniq [obj.id]. Nếu uniq đã có thuộc tính id, nó sẽ trả về true, ước lượng thành false (!) Nói với hàm bộ lọc KHÔNG thêm obj đó. Tuy nhiên, nếu nó không tìm thấy thuộc tính obj.id, nó sẽ trả về false, sau đó đánh giá là true (!) Và trả lại mọi thứ ở bên phải của &&, hoặc (uniq [obj.id] = true). Đây là một giá trị trung thực, nói cho phương thức bộ lọc thêm obj đó vào mảng được trả về và nó cũng thêm thuộc tính {1: true} vào uniq. Điều này đảm bảo rằng bất kỳ trường hợp obj nào khác có cùng id đó sẽ không được thêm lại.