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

การกรองค่าซ้ำในอาร์เรย์ให้เหลือเพียงค่าเดียวใน JavaScript

ภาพรวม

บทความนี้สาธิตวิธีดึงค่าที่ซ้ำกันในอาร์เรย์ออกมา เพียงค่าเดียวต่อค่าหนึ่ง (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 ComplexitySpace Complexityหมายเหตุ
Loop + indexOf + includesO(n²)O(k)เข้าใจง่าย ช้า
Set + LoopO(n)O(n)เร็วที่สุด แนะนำใช้
Reduce + ObjectO(n)O(n)ได้จำนวนครั้งที่ซ้ำด้วย
Filter + indexOfO(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 }