Chào các bạn, hôm nay cafedev chia sẻ cho ace một danh sách các bài tập từ cơ bản tới nâng cao liên quan tới các kiến thức cơ bản trong lập trình Javascript. Cụ thể, trong bài này chúng ta sẽ làm quen với Map, WeakMap,Set, WeakMap, Object.key, Huỷ gán. Từ đó giúp ace nâng cao kiến thức, kỹ năng, kinh nghiệm lập trình của mình và áp dụng nó vào thực tế.

Trước khi đi vào chi tiết bài tập, cafedev khuyến khích ace tự code bài tập của mình trước khi tham khảo bài hướng dẫn nhé.

Để chạy hoặc code các bài tập sau, ace có thể code trên trang web này như sau:

  • Chọn new
  • Chọn dự án bạn muốn code, ở đây có nhiều lựa chọn như Javascript, AngularJS, React,…. Tất nhiên mình sẽ chọn Javascript.
  • Sau đó bạn sẽ thấy nơi bạn code.
  • Sau khi code sau chọn Preview để xem kết quả.

Ngoài ra ace cũng có thể dùng các IDE đã được giới thiệu tại đây để code và chạy code đó trên máy tính của mình nhé.

Lưu ý: Mọi bài tập bên dưới cũng như các bài tập khác trong Series Javascript này được tạo ra từ các bài học và kiến thức của từng phần trong series tự học Javascript này. Nếu ace nào chưa làm được hoặc chưa hiểu kỹ về bài học thì bạn có thể tham khảo lại series tự học này nhé. Chúc các bạn thành công.

Bài 1

Cho arr là một mảng.

Tạo một hàm unique(arr) sẽ trả về một mảng với các phần tử duy nhất của arr. Ví dụ:

function unique(arr) {
  /* your code */
}

let values = ["Hare", "Krishna", "Hare", "Krishna",
  "Krishna", "Krishna", "Hare", "Hare", ":-O"
];

alert( unique(values) ); // Hare, Krishna, :-O

Bài 2

Đảo ngữ là những từ có cùng số lượng các chữ cái giống nhau, nhưng theo thứ tự khác nhau. Ví dụ đảo ngữ:

-->
nap - pan
ear - are - era
cheaters - hectares - teachers

Viết một hàm aclean(arr) trả về một mảng được làm sạch các ký tự đảo ngữ, chỉ in ra các ký tự không bị đảo ngữ.

Ví dụ:

let arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectares"];

alert( aclean(arr) ); // "nap,teachers,ear" or "PAN,cheaters,era"

Bài 3

Chúng ta muốn nhận một mảng map.keys () trong một biến và sau đó áp dụng các phương thức dành riêng cho mảng đó, ví dụ: .push.

Nhưng điều đó không hoạt động:

let map = new Map();

map.set("name", "David");

let keys = map.keys();

// Error: keys.push is not a function
keys.push("more");

Tại sao? Làm thế nào chúng ta có thể sửa code trên để làm cho keys.push hoạt động?

Hướng dẫn cách xem và tải tài liệu từ trang cafedev tại đây.


Giải bài 1,2,3

Bài 4

Có một loạt các thông báo:

let messages = [
  {text: "Hello", from: "John"},
  {text: "How goes?", from: "John"},
  {text: "See you soon", from: "Alice"}
];

Code của bạn có thể truy cập vào nó, nhưng các tin nhắn được quản lý bởi code của người khác. Các tin nhắn mới được thêm vào, các tin nhắn cũ được code đó xóa thường xuyên và bạn không biết chính xác thời điểm điều đó xảy ra.

Bây giờ, bạn có thể sử dụng cấu trúc dữ liệu nào để lưu trữ thông tin về việc thông báo “đã được đọc” chưa? Cấu trúc phải phù hợp để đưa ra câu trả lời “nó đã được đọc chưa?” cho đối tượng tin nhắn đã cho.

P.S. Khi một phần tử bị xóa khỏi messages, phần tử đó cũng sẽ biến mất khỏi cấu trúc của bạn.

P.P.S. Chúng ta không nên sửa đổi các đối tượng tin nhắn, thêm các thuộc tính của chúng ta vào chúng. Vì chúng được quản lý bởi code của người khác, điều đó có thể dẫn đến hậu quả xấu.

Bài 5

Tiếp theo bài trước chúng ta có:

let messages = [
  {text: "Hello", from: "John"},
  {text: "How goes?", from: "John"},
  {text: "See you soon", from: "Alice"}
];

Câu hỏi bây giờ là: bạn nên đề xuất cấu trúc dữ liệu nào để lưu trữ thông tin: “khi nào tin nhắn được đọc?”.

Bây giờ chúng ta cần lưu trữ ngày tháng và nó chỉ nên lưu lại trong bộ nhớ cho đến khi tin nhắn được dọn dẹp.

P.S. Ngày có thể được lưu trữ dưới dạng các đối tượng của lớp Date có sẵn trong js mà chúng ta sẽ đề cập sau.


Giải bài 4,5

Bài 6

Có đối tượng salaries với số lượng lương tùy ý.

Viết hàm sumSalaries(salaries) trả về tổng của tất cả các khoản tiền lương bằng cách sử dụng Object.values ​​và vòng lặp for..of.

Nếu tiền lương trống, thì kết quả phải là 0. Ví dụ

let salaries = {
  "John": 100,
  "Pete": 300,
  "Mary": 250
};

alert( sumSalaries(salaries) ); // 650

Bài 7

Viết một hàm count(obj) trả về số thuộc tính trong đối tượng:

Cố gắng làm cho mã càng ngắn càng tốt.

Bài 8

Chúng ta có một đối tượng:

let user = {
  name: "John",
  years: 30
};

Viết lệnh hủy gán với yêu cầu:

  • thuộc tính name vào biến name.
  • thuộc tính years vào biến age.
  • thuộc tính isAdmin vào biến isAdmin (sai, nếu không có thuộc tính này)

Dưới đây là ví dụ về các giá trị sau chạy:

let user = { name: "David", years: 30 };

// your code to the left side:
// ... = user

alert( name ); // David
alert( age ); // 30
alert( isAdmin ); // false

Bài 9

Có một đối tượng salaries:

let salaries = {
  "John": 100,
  "Pete": 300,
  "Mary": 250
};

Tạo hàm topSalary(salaries) trả về tên của người được trả lương cao nhất.

  • Nếu tiền lương trống, nó sẽ trả về null.
  • Nếu có nhiều người được trả cao nhất, hãy trả lại 1 người bất kỳ trong số họ.

Hướng dẫn cách xem và tải tài liệu từ trang cafedev tại đây.


Giải bài 6,7,8,9

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!