Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Javascript

บีบอัดอาร์เรย์เพื่อจัดกลุ่มองค์ประกอบที่ต่อเนื่องกัน JavaScript


เราได้รับสตริงที่มีคำซ้ำบางคำคั่นด้วยเครื่องหมายขีดกลาง (-) เช่นนี้ −

const str = 'monday-sunday-tuesday-tuesday-sunday-sunday-monday-mondaymonday';

ตอนนี้งานของเราคือการเขียนฟังก์ชันที่ส่งคืนอาร์เรย์ของอ็อบเจ็กต์ โดยที่แต่ละอ็อบเจ็กต์ประกอบด้วยค่าคุณสมบัติสองค่าและการนับ ค่าคือคำในสตริง (วันจันทร์ วันอังคาร วันอาทิตย์) และcount คือจำนวนที่ปรากฏขึ้นติดต่อกัน

เช่นเดียวกับสตริงด้านบน อาร์เรย์นี้จะมีลักษณะดังนี้ -

const arr = [{
   val: 'monday',
   count: 1
}, {
   val: 'sunday',
   count: 1
}, {
   val: 'tuesday',
   count: 2
}, {
   val: 'sunday',
   count: 2
}, {
   val: 'monday',
   count: 3
}]

เพราะวันจันทร์ปรากฏหนึ่งครั้ง จากนั้นวันอาทิตย์หนึ่งครั้ง วันอังคารสองครั้ง วันอาทิตย์สองครั้ง และครั้งสุดท้ายวันจันทร์สามครั้ง

เราจะแยกอาร์เรย์แล้วใช้วิธี Array.prototype.reduce() เพื่อคืนค่าอาร์เรย์ที่ต้องการแบบเรียกซ้ำเช่นนี้ -

นี่คือรหัสที่สมบูรณ์ -

ตัวอย่าง

const str = 'monday-sunday-tuesday-tuesday-sunday-sunday-monday-mondaymonday';
const str2 = 'friday-friday-sunday-tuesday-sunday-sunday-monday-thursdaymonday';
const compressString = (str) => {
   return str.split('-').reduce((acc, val) => {
      const { length: l } = acc;
      if(acc[l-1]?.val === val){
         acc[l-1].count++;
         return acc;
      }else{
         return acc.concat({
            val,
            count: 1
         });
      }
   }, []);
}
console.log(compressString(str));
console.log(compressString(str2));

ผลลัพธ์

ผลลัพธ์ในคอนโซลของโค้ดด้านบนจะเป็น −

[
   { val: 'monday', count: 1 },
   { val: 'sunday', count: 1 },
   { val: 'tuesday', count: 2 },
   { val: 'sunday', count: 2 },
   { val: 'monday', count: 3 }
]
[
   { val: 'friday', count: 2 },
   { val: 'sunday', count: 1 },
   { val: 'tuesday', count: 1 },
   { val: 'sunday', count: 2 },
   { val: 'monday', count: 1 },
   { val: 'thursday', count: 1 },
   { val: 'monday', count: 1 }
]