Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

หาค่าซ้ำในอาร์เรย์ แต่ละค่าแสดงเพียงครั้งเดียว - JavaScript

จากอาร์เรย์ที่มีค่าซ้ำหลายครั้ง ให้ดึงเฉพาะค่าที่ซ้ำ (ปรากฏมากกว่า 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²)