Array Không Chỉ Là Array

3 minute read

Hầu hết các ngôn ngữ đều trang bị kiểu aray để xử lý, lưu trữ nhiều phần tử cùng lúc, JS cũng không ngoại lệ NHƯNG array trong JS không chỉ đơn giản là array. Chúng ta có thể dùng array làm:

  1. Array, cái này đương nhiên.
  2. Stack.
  3. Queue.
  4. Dictionary.
  5. Sortable List.
  6. String Builder.
  7. Combo.

1️. Stack

Bỏ qua cái thứ 1, chúng ta có thể dùng array như 1 stack, đặc tính của stack là LIFO (đi trễ về sớm). Có 2 method để là chuyện này là push và pop

1const array = [1, 2, 3];
2array.push(4); // => [1, 2, 3, 4]
3array.pop() // => [1, 2, 3]

2. Queue

Sử dụng array như 1 queue cũng có 2 method là unshift (enqueue), shift (dequeue) để đảm bảo đặc tính FIFO (đi sớm về sớm)

1const array = [1, 2, 3];
2array.shift(); // => [2, 3
3array.unshift(1) // => [1, 2, 3]

3. Dictionary

Dùng array như môt Dictionary có hơi miễn cưỡng nhưng ok, fine, nó vẫn hoạt động bình thường

1const array = [1, 2, 3];
2array['$key1'] = 1; => [1, 2, 3]
3array.$key2 = 2; => [1, 2, 3]
4delete array.$key; => [1, 2, 3]

Như các bạn đã thấy, việc thao tác trên key có 2 điểm cần lưu ý, key phải thêm ký tự phân biệt nào đó để tránh trùng tên với những prop/method của array, ở đây mình dùng dấu $. Thứ hai là việc thêm hay xóa key không làm thay đổi số lượng phần tử trong array. Muốn duyệt key thì dùng

1for(let key in array) // => 1, 2, 3, $key1 (không có $key2 vì đã bị delete)

4. Sortable List

Dùng array như sortable list khá đơn giản, bản thân method sort của array là mutable nên mỗi lần thêm item mới vào thì chúng ta sort lại

1const array = [5, 6, 7];
2array.push(1); // => [5, 6, 7, 1]
3array.sort(); // => [1, 5, 6, 7]

5. String Builder

Array còn được sử dụng như String Builder, đa số ngôn ngữ lập trình, việc nối chuỗi mất khá nhiều bộ nhớ và chậm, vi mỗi lần nối chuỗi thì hệ thống phải cấp phát vùng nhớ mới rộng hơn, ứng với độ dài chuỗi củ và mới cộng lại, sau đó sao chép cả 2 vào đó. Nên xử lý chuỗi nhiều có thể làm chậm he thống, vì vậy String Builder ra đời, giúp tối ưu việc chỉnh sửa chuỗi.

1const stringBuilder = [];
2for(let i [0; i < 10000; i++) {
3  stringBuilder.push('Hello World');
4}
5const result = stringBuilder.join('');

6. Combo

Cách này là một cách tà đạo của array, dùng kết hợp array + dictionary. Ví dụ bạn có một hàm tìm kiếm theo điều kiện sau đó trả về danh sách kết quả tìm được và thứ tự của các phần tử đó trong danh sách ban đầu

 1const userTable = [ { name: 'A' }, { name: 'B' }, { name: 'C' } ];
 2function findUsers(predicate) {
 3  const indexes = [];
 4  const users = userTable.filter((user, index) => {
 5    if(predicate(user)) {
 6      indexes.push(index);
 7      return true;
 8    }
 9    return false;
10  });
11  return { users, indexes };
12}
13const result = findUsers(user => user.name === 'A' || user.name === 'C');
14console.log(result.users); // => [ { name: 'A' }, { name: 'C' } ]
15console.log(result.indexes); // => [0, 2]
16
17
18// cách làm truyền thống như trên có thể thay thế bằng
19function findUsers(predicate) {
20  const indexes = [];
21  const users = userTable.filter((user, index) => {
22    if(predicate(user)) {
23      indexes.push(index);
24      return true;
25    }
26    return false;
27  });
28  users.indexes = indexes;
29  return users;
30}
31const result = findUsers(user => user.name === 'A' || user.name === 'C');
32console.log(result); // => [ { name: 'A' }, { name: 'C' } ]
33console.log(result.indexes); // => [0, 2]

☑️ Tổng kết lại thì JS trang bị một kiểu array quá bá đạo, nó có thể đảm nhiệm nhiều chức năng của những kiểu dữ liệu khác nhau. Vẫn câu nói cũ: Tuy đơn giản nhưng không kém phần phức tạp :D