NodeJS Practice 1: Tối ưu code của bạn với Map và Object

Nodejs Feb 26, 2020

Xin chào mọi người, mình quay trở lại rồi đây, tuy nhiên hôm nay mình sẽ nói về Nodejs nhé. Đây cũng là ngôn ngữ thế mạnh của mình, còn Golang là đang trong quá trình học thôi. Tạm thời mình đang tạm dừng chuỗi bài thực hành Golang vì nghỉ tết và sau khi nghỉ tết thì phải OT sập mặt LOL. Tuy nhiên mấy nay ngứa ngáy với đúng dịp hơi bất mãn 1 số blog viết về chủ đề Map và Object cứ copy mà không cần test làm mình copy theo và vất vả sửa thấy mợ nên mình xin phép được giãi bày 1 số kiến thức hạn hẹn vừa tham khảo được về vấn đề trên. Tiện thể giúp các bạn viết code 1 cách sạch hơn và hiệu quả hơn với Nodejs nhé.

Bạn có thể tự hỏi - tại sao Map vs Object mà không phải Map vs Array, hay Object vs Set? Chà, bạn cũng có thể so sánh giữa bất kỳ  gì trong những cái trên, nhưng Map và Object, không giống như những cái khác, có các trường hợp sử dụng rất giống nhau đòi hỏi chúng ta phải hiểu sâu hơn về họ để quyết định điều gì tốt hơn khi nào. Và đó là những gì về điều này. Let's start...

Map

Map is a data collection type (in a more fancy way — abstract data structure type), in which, data is stored in a form of pairs, which contains a uniquekey and value mapped to that key. And because of the uniqueness of each stored key, there is no duplicate pair stored.

Hiểu nôm na là nó cũng là 1 Object, trong Javascript nói chung và Nodejs nói riêng mọi kiểu dữ liệu đều là Object, bạn sẽ tự hỏi vậy String, Number... thì là thế nào. Xin mời search google để biết thêm chi tiết, ở bài này thì mình sẽ không đề cập vấn đề này ahihi... Ok, Map là 1 kiểu Object, trong đó dữ liệu được lưu trữ dưới dạng các cặp key-value, trong đó có một khóa key duy nhất và value được ánh xạ tới key đó và không có key nào được phép trùng nhau. Nghe na ná Object nhỉ, ơ mà nó là 1 kiểu Object mà =)))) Nghe mà đau não :v

Important note: key and value in Map can be in any data type,not limited to only string or integer.

Đến đây nghe khác nhau rồi đấy, key và value của Map có thể là bất cứ thứ gì cho dù là Object, Regex,...

Object

Regular Object (pay attention to the word ‘regular’ ) in Javascript is dictionary type of data collection — which means it also follows key-value stored concept like Map. Each key in Object — or we normally call it “property” — is also unique and associated with a single value.
In addition, Object in Javascript has built-in prototype. And don’t forget, nearly all objects in Javascript are instances of Object, including Map.

Chắc mọi người đã quá quen thuộc với Object rồi, những ai đã làm việc với Javascript thì chắc hẳn đều xài đến nó, nó là tập hợp dữ liệu được lưu dưới dạng key-value trong đó key luôn là kiểu String, còn value có thể là bất cứ thứ gì...

Example: {1: ‘smile’, 2: ‘cry’, 42: ‘happy’}

Theo định nghĩa, Object và Map dựa trên cùng một khái niệm - sử dụng key-value để lưu trữ dữ liệu. Tuy nhiên, giống nhau nhưng khác nhau - chúng thực sự khá khác biệt với nhau, chủ yếu ở:

Key field: trong Object, nó tuân theo quy tắc của dictionary thông thường. Các key PHẢI là string hoặc symbols. Chỉ có bấy nhiêu thôi. Nhưng trong Map, nó có thể là bất kỳ kiểu dữ liệu nào (Object, Array, v.v.). Hãy thử sử dụng một đối tượng khác làm khóa thuộc tính Object- tôi thách bạn đấy  :))
Thứ tự phần tử: trong Map, bạn đẩy các phần tử vào như thế nào thì nó có thứ tự như thế đó, trong khi trong Object, tôi không chắc =))))). Bạn có thể thử =))))
Kế thừa: Map là một instance  của Object (nãy nói rồi nhé!), Nhưng Object chắc chắn không phải là một instance của Map.

var map = new Map([[1,2],[3,4]]);
console.log(map instanceof Object); //true

var obj = new Object();
console.log(obj instanceof Map); //false

Lý thuyết là vậy nhé, vậy thì khi nào thì nên xài tụi này ? Đối với mình thì mình thường dùng để code sạch sẽ hơn và rõ ràng hơn khi muốn lưu trữ dữ liệu muốn map 1 cách nhanh chóng hay đơn giản là thay thế các lệnh rẽ nhánh If/else Switch/case rườm rà và rắc rối. Đơn cử

if (status == 1) {                                                                
    logStatus('processing');
    redirect('IndexPage');
} else if (status == 2) {
   redirect('fail');
   redirect('FailPage')
} else if(status == 3) {
   logStatus('success');
  redirect('SuccessPage')
}

Ta có thể viết lại như sau với Object và Map

Object
value là Array :
const actions = {
   '1':['processing','IndexPage'],
   '2':['fail','FailPage'],
   '3':['success','SuccessPage']
}
const action = (status) => {
   logStatus(actions[status][0]);
   redirect(actions[status][1])
}
value là Function:
const actions = {
   '1': () => { /* do  something A*/ },
   '2': () => { /* do  something B*/ },
   '3': () => { /* do  something C*/ },
}
const action = (status) => actions[status]()
const action = (status) => actions[status].call()
Map
value là Array :
const actions = new Map([
   [1,['processing','IndexPage']],
   [2,['fail','FailPage']],
   [3,['success','SuccessPage']]
])
const actions = (status) => {
logStatus(actions.get(status)[0])
   redirect(actions.get(status)[1])
}
value là Function:
const actions = new Map([
   [1, () => { /* do  something A*/ }],
   [2, () => { /* do  something A*/ }],
   [3, () => { /* do  something A*/ }]
])
const actions = (status) => actions.get(status)()
const actions = (status) => actions.get(status).call()

Ok các bạn có thể thấy nó gọn gàng và dễ hiểu hơn rồi đấy. À giải thích thêm actions.get(status) ở đây là lấy ra giá trị trong Map tương ứng với status nhé và nhớ thêm dấu () hoặc .call() để thực thi nếu giá trị là 1 function.

1 số function cơ bản của Map:

  • new Map() – Tạo mới 1 Map ha.
  • map.set(key, value) – Lưu lại key-value tương ứng ha.
  • map.get(key) – returns về giá trị của key tương ứng, undefined nếu key không tồn tại trong Map.
  • map.has(key) – returns true nếu key  tại, không thì false .
  • map.delete(key) – removes cặp key-value đó.
  • map.clear() – removes toàn bộ giá trị trong Map.
  • map.size – returns số phần tử hiện tại của Map.

When to use Map? And when to use Object?

  • Object là lựa chọn tuyệt vời cho các tình huống khi chúng ta chỉ cần cấu trúc đơn giản để lưu trữ dữ liệu và biết rằng tất cả các key là chuỗi (hoặc Symbol), bởi vì việc tạo Object đơn giản và truy cập thuộc tính Object với một key cụ thể nhanh hơn nhiều so với việc tạo Map (literal  và constructor, direct v get() function call — you know what wins already).
  • Ngoài ra, trong các trường hợp cần áp dụng logic riêng cho các property/element(s),  Object chắc chắn là sự lựa chọn. Example:
var obj = {
    id: 1,
  name: "It's Me!",
    print: function () {
        return `Object Id: ${this.id}, with Name: ${this.name}`;
  }
}
console.log(obj.print());//Object Id: 1, with Name: It's Me.

Bạn thử với Map xem ahihi. You can’t! =)))))

  • Hơn nữa, JSON có hỗ trợ trực tiếp cho Object, nhưng không có với Map (chưa). Vì vậy, trong tình huống nhất định mà chúng ta phải làm việc rất nhiều với JSON, hãy xem Object là tùy chọn tốt nhất hiện nay.
  • Mặt khác, Map hoàn toàn là hàm băm, Object còn hơn thế (với sự hỗ trợ logic bên trong). Và việc sử dụng toán tử delete với thuộc tính Đối tượng có một số vấn đề về hiệu năng (chúng ta sẽ thảo luận về vấn đề này trong một bài viết khác). Do đó, Map Thực hiện tốt hơn trong các tình huống liên quan đến việc bổ sung và loại bỏ thường xuyên các cặp khóa-giá trị.
  • Ngoài ra, Map duy trì thứ tự các key của nó - không giống như Object, vì vậy trong trường hợp thứ tự lặp các yếu tố rất quan trọng, hãy xem xét Map - nó sẽ đảm bảo hiệu suất lặp ổn định hơn.
  • Và cuối cùng nhưng không kém phần quan trọng, Map có xu hướng hoạt động tốt hơn trong việc lưu trữ bộ dữ liệu lớn, đặc biệt là khi tất cả các key đều cùng  type (ví dụ key đều là String hết chứ đừng lúc thì String lúc thì Number) và tất cả các value là cùng type.

Sau bài này bạn đã có cái nhìn tổng quan hơn cho Map và Object chưa. Bạn thích xài cái nào hơn. Tuỳ từng trường hợp mà chọn cho mình giải pháp đúng đắn và phù hợp nhé. Tham khảo thêm ở đây nha

Map
The Map object holds key-value pairs and remembers the original insertion order of the keys.
Map in JavaScript - GeeksforGeeks
A computer science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.