[Javascript] Xoá string object trùng lặp trong array

Trong Javascript, xoá string (chuỗi) hay object (đối tượng) trùng lặp trong array (mảng) tưởng như dễ dàng, nhưng thực tế cũng không hề dễ dàng.

Bởi vì chúng ta cần phải quan tâm tới hiệu xuất của nó.

Và trong đó khó nhất là xoá đối tượng (object) trùng lặp trong một mảng.

Hãy thử tìm cách để giải quyết các vấn đề này.

Xoá chuỗi trùng lặp trong mảng

Xét ví dụ mẫu:

const strings = [  "chuỗi trùng lặp",  "chuỗi không trùng lặp",  "chuỗi trùng lặp" ];

Trong trường hợp này, có thể dùng phương thức filter() , kết hợp với phương thức indexOf() để check các key nào trùng trong mảng.

const filteredStrings = strings.filter((item, index) => { // Trả về mảng mới, nếu index của item hiện tại là giống với lần xuất hiện đầu tiên của item return strings.indexOf(item) === index; });

Lưu ý

Các đối tượng được so sánh dựa trên tham chiếu chứ không phải cấu trúc. Nên hai đối tượng có cùng một giá trị và giá trị không được xem xét khi so sánh hai đối tượng.
Do đó, indexOf (đối tượng) trong một mảng các đối tượng sẽ luôn trả về chỉ mục của đối tượng chính xác được truyền, ngay cả khi tồn tại một đối tượng khác có cùng thuộc tính và giá trị chính xác.

Xoá đối tượng trùng lặp trong mảng

Hàm dưới đây sẽ giải quyết vấn đề này.

function removeDuplicates(arr) { const result = []; const duplicatesIndices = []; // Lặp qua từng mục trong mảng ban đầu arr.forEach((current, index) => { if (duplicatesIndices.includes(index)) return; result.push(current); // Lặp qua từng mục khác trên mảng sau mục hiện tại for (let comparisonIndex = index + 1; comparisonIndex < arr.length; comparisonIndex++) { const comparison = arr[comparisonIndex]; const currentKeys = Object.keys(current); const comparisonKeys = Object.keys(comparison); // Kiểm tra số lượng Keys trong đối tượng if (currentKeys.length !== comparisonKeys.length) continue; // Kiểm tra tên key const currentKeysString = currentKeys.sort().join("").toLowerCase(); const comparisonKeysString = comparisonKeys.sort().join("").toLowerCase(); if (currentKeysString !== comparisonKeysString) continue; // Kiểm tra value let valuesEqual = true; for (let i = 0; i < currentKeys.length; i++) { const key = currentKeys[i]; if ( current[key] !== comparison[key] ) { valuesEqual = false; break; } } if (valuesEqual) duplicatesIndices.push(comparisonIndex); } // kết thúc vòng lặp for }); // kết thúc arr.forEach() return result; }

Trả lời

Close Menu