Computer >> Máy Tính >  >> Lập trình >> Javascript

Nén mảng để nhóm các phần tử liên tiếp JavaScript

Chúng tôi được cung cấp một chuỗi chứa một số từ lặp lại được phân tách bằng dấu gạch ngang (-) như thế này -

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

Bây giờ, công việc của chúng ta là viết một hàm trả về một mảng các đối tượng, trong đó mỗi đối tượng bao gồm hai giá trị và số thuộc tính, giá trị là từ trong chuỗi (Thứ Hai, Thứ Ba, Chủ Nhật) và số lượng là số lần xuất hiện liên tiếp của chúng.

Giống như chuỗi trên, mảng này sẽ trông giống như thế này -

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

Bởi vì thứ hai xuất hiện một lần, sau đó chủ nhật xuất hiện một lần, thứ ba hai lần, chủ nhật hai lần và cuối cùng là ba lần.

Chúng tôi sẽ tách mảng và sau đó sử dụng phương thức Array.prototype.reduce () để trả về đệ quy mảng mong muốn như thế này -

Đây là mã hoàn chỉnh -

Ví dụ

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));

Đầu ra

Đầu ra trong bảng điều khiển cho đoạn mã trên sẽ là -

[
   { 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 }
]