ภาพรวม
บทความนี้สาธิตวิธีดึงค่าที่ซ้ำกันในอาร์เรย์ออกมา เพียงค่าเดียวต่อค่าหนึ่ง (Unique Duplicates) เช่น อาร์เรย์ [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4] จะได้ผลลัพธ์ [1, 4, 3, 2]
การนำไปใช้
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
const removeDuplicate = (arr) => {
const res = [];
for (let i = 0; i < arr.length; i++) {
// ตรวจสอบว่าค่านี้ปรากฏมากกว่า 1 ครั้ง
if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
// และยังไม่ได้อยู่ในผลลัพธ์
if (!res.includes(arr[i])) {
res.push(arr[i]);
}
}
}
return res;
};
console.log(removeDuplicate(arr)); // [1, 4, 3, 2]
ผลลัพธ์
[1, 4, 3, 2]
วิธีการทันสมัยและมีประสิทธิภาพมากกว่า
1. ใช้ Set และ Filter (O(n))
const findDuplicates = (arr) => {
const seen = new Set();
const duplicates = new Set();
for (const item of arr) {
if (seen.has(item)) {
duplicates.add(item);
} else {
seen.add(item);
}
}
return [...duplicates];
};
2. ใช้ reduce และ Object/Map
const findDuplicatesReduce = (arr) => {
const counts = arr.reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
return Object.keys(counts)
.filter(key => counts[key] > 1)
.map(key => isNaN(key) ? key : Number(key));
};
3. ใช้ filter กับ indexOf (สั้นแต่ช้า O(n²))
const findDuplicatesShort = (arr) =>
[...new Set(arr.filter((item, index) => arr.indexOf(item) !== index))];
เปรียบเทียบประสิทธิภาพ
| วิธี | Time Complexity | Space Complexity | หมายเหตุ |
|---|---|---|---|
| Loop + indexOf + includes | O(n²) | O(k) | เข้าใจง่าย ช้า |
| Set + Loop | O(n) | O(n) | เร็วที่สุด แนะนำใช้ |
| Reduce + Object | O(n) | O(n) | ได้จำนวนครั้งที่ซ้ำด้วย |
| Filter + indexOf | O(n²) | O(n) | โค้ดสั้น แต่ช้า |
กรณีศึกษา: นับจำนวนครั้งที่ซ้ำด้วย
const getDuplicateCounts = (arr) => {
return arr.reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
};
// ผลลัพธ์: { '1': 3, '4': 4, '3': 3, '2': 2 }