จากอาร์เรย์ที่มีค่าซ้ำหลายครั้ง ให้ดึงเฉพาะค่าที่ซ้ำ (ปรากฏมากกว่า 1 ครั้ง) แสดงแค่ครั้งเดียว
ตัวอย่าง
Input: [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4] Output: [1, 4, 3, 2]
ตัวอย่างโค้ด
const arr = [1, 4, 3, 3, 1, 3, 2, 4, 2, 1, 4, 4];
const pickDuplicate = arr => {
const res = [];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) !== arr.lastIndexOf(arr[i])) {
if (!res.includes(arr[i])) {
res.push(arr[i]);
}
}
}
return res;
};
console.log(pickDuplicate(arr));
ผลลัพธ์
[1, 4, 3, 2]
วิธีแบบ ES6+ (มีประสิทธิภาพมากกว่า)
// ใช้ Set + filter
const pickDuplicate = arr =>
[...new Set(arr.filter((v, i, a) => a.indexOf(v) !== i))];
// หรือใช้ Map นับความถี่
const pickDuplicate = arr => {
const freq = new Map();
for (const v of arr) freq.set(v, (freq.get(v) || 0) + 1);
return [...freq.entries()].filter(([_, c]) => c > 1).map(([v]) => v);
};
เวอร์ชัน Map เร็วที่สุด O(n) ในขณะที่ indexOf/lastIndexOf เป็น O(n²)