Thứ năm, 12/12/2019 | 00:00 GMT+7

Cách đếm số nguyên âm trong một chuỗi văn bản bằng thuật toán JavaScript


Trong những năm qua, JavaScript tiếp tục nhận được nhiều sự chú ý khi các khả năng ngày càng rộng lớn của nó tiếp tục được mở rộng. Nó đã phát triển từ chỗ chỉ là một ngôn ngữ kịch bản phía client để tạo giao diện web tương tác thú vị sang được sử dụng rộng rãi ở phía server , cho các ứng dụng di động, ứng dụng máy tính để bàn, hệ thống nhúng, IOT, v.v. Mặc dù có rất nhiều khuôn khổ có sẵn để nâng cao điểm mạnh của một nhà phát triển JavaScript, nhưng học cách làm việc với JavaScript vani để thực hiện mọi việc theo cách hiệu quả nhất là một kỹ năng cơ bản.

Trong bài viết này, bạn sẽ triển khai hai cách tiếp cận thuật toán khác nhau bằng cách sử dụng vanilla JavaScript. Bạn nên cố gắng tự làm trước và chỉ tham khảo mã để đi đúng hướng, xác nhận các giải pháp của bạn và nghiên cứu các phương pháp tiếp cận khác.

Thử thách của bạn là nhận một chuỗi văn bản có độ dài bất kỳ và trả về số nguyên âm được tìm thấy trong văn bản.

Tư duy thuật toán

Đọc qua câu lệnh thách thức, bạn sẽ nhận thấy câu lệnh nhận được một chuỗi văn bản . Nếu bạn đã khá quen với việc lập trình nói chung, điều này nên lưu ý đến ý tưởng về các hàm. Ta có thể viết một hàm có một tham số gọi là "text". Văn bản sẽ là một chuỗi có độ dài bất kỳ sẽ được chuyển đến hàm dưới dạng đối số khi nó được gọi.

Tiếp theo, trong hàm, ta phải xem qua văn bản và tìm kiếm sự xuất hiện của các nguyên âm tiếng Anh (“a”, “e”, “i”, “o”, “u”). Sau đó, hàm trả về tổng số kết quả phù hợp (nguyên âm) được tìm thấy. Bạn có thể dừng việc thực thi một hàm và trả về một giá trị từ hàm đó bằng các câu lệnh return .

Triển khai mã

Ta sẽ khám phá hai cách để thực hiện điều này. Đầu tiên là cách tiếp cận lặp và sau đó là sử dụng các biểu thức chính quy.

Phương pháp tiếp cận lặp lại

Trong cách tiếp cận lặp lại, ta sẽ lặp qua từng chữ cái của chuỗi được truyền qua và sau đó kiểm tra xem chúng có trùng với bất kỳ nguyên âm nào không. Trước khi chạy qua văn bản, ta sẽ khởi tạo bộ đếm và gán giá trị bằng 0. Trong trường hợp có sự trùng khớp, ta tăng bộ đếm.

Đây là cách triển khai của ta :

/_
An iterative approach to counting the number of vowels in a
string of text.
_/
const vowels = ["a", "e", "i", "o", "u"]


function countVowelsIterative(text) {
// Initialize counter
let counter = 0;


// Loop through text to test if each character is a vowel
for (let letter of text.toLowerCase()){
    if (vowels.includes(letter)) {
       counter++
    }
}


// Log formatted response to console
console.log(`The text contains ${counter} vowel(s)`)


// Return number of vowels
return counter
}

/_
    ============== Test Case ===================
_/
countVowelsIterative('I am a world-class developer using iterations');
// Logs "The text contains 16 vowel(s)" to the console
// returns 16
  • Đầu tiên, ta khai báo một vowels không đổi chứa một mảng trong số năm nguyên âm tiếng Anh.
  • Tiếp theo, ta sử dụng vòng lặp for…of để lặp qua từng chữ cái của văn bản. Nếu bạn không rành về điều này, vòng lặp for…of sẽ tạo ra một vòng lặp lặp qua các đối tượng có thể lặp lại. Các đối tượng có thể lặp lại có thể là chuỗi, mảng, bản đồ, tập hợp, v.v.
  • Lưu ý cách ta chuyển đổi tất cả các chữ cái của văn bản thành chữ thường trong vòng lặp. Điều này là do, ta không muốn bỏ lỡ các trường hợp nguyên âm viết hoa trong văn bản đã chuyển (tin tôi rằng đó không phải là cố ý).
  • Tiếp theo trong vòng lặp, ta sử dụng một if tuyên bố để kiểm tra xem lá thư được chọn sẽ có trong mảng các nguyên âm, ta được định nghĩa đó. Một cách phù hợp, ta gọi phương thức include includes() trên mảng các nguyên âm để xác định xem mảng có bao gồm chữ cái đã chọn, trả về true hay false khi thích hợp.
  • Nếu điều kiện đánh giá là true , ta tăng bộ đếm.
  • Sau khi lặp qua, ta ghi lại một thông báo đã định dạng vào console cho ta biết số nguyên âm và sau đó trả về bộ đếm tương đương với số nguyên âm được tìm thấy.

Bây giờ ta hãy xem xét một cách tiếp cận khác.

Biểu thức chính quy

Biểu thức chính quy giúp ta tìm các mẫu hoặc ký tự / kết hợp ký tự trong chuỗi. Điều này có liên quan đến ta vì các biểu thức chính quy sẽ giúp ta tìm thấy các ký tự mong muốn trong văn bản được truyền. Theo phần mở rộng, biểu thức chính quy có thể giúp ta làm những việc đáng chú ý hơn như triển khai các bộ lọc nội dung. Biểu thức chính quy cũng giữ nguyên trên các ngôn ngữ lập trình. Hãy xem xét các giải pháp.

Đây là cách triển khai của ta :

/_
    Using Regular Expressions to count the number of vowels in a
    string of text.

_/

function countVowelsRegex(text) {
    // Search text with Regex and store all matching instances
    let matchingInstances = text.match(/[aeiou]/gi);

    // Check if matching instances exist then calculate length
    if(matchingInstances) {
        // Log formatted response to console
         console.log(`The text contains ${matchingInstances.length} vowel(s)`)

         // Return number of vowels
        return matchingInstances.length
    } else{
        return 0
    }
}

/_
    ============== Test Case ===================
_/
countVowelsRegex('I am a world-class developer using Regex');
    // Logs "The text contains 13 vowel(s)" to the console
    // returns 13
  • Điều đầu tiên ta đã làm trong hàm là gọi phương thức thematch() trên văn bản, phương thức này trả về một mảng các kết quả phù hợp được tìm thấy sau khi so khớp biểu thức chính quy được truyền dưới dạng đối số chống lại văn bản.
  • Biểu thức chính quy chỉ định các chữ cái cần tìm trong dấu ngoặc [] . Đối với các mẫu đơn giản, biểu thức chính quy thường được xác định trong một cặp dấu gạch chéo. Chú ý các ký tự gi sau dấu gạch chéo đóng?
  • g là viết tắt của một tìm kiếm global không trở lại sau trận đấu đầu tiên, bắt đầu lại các tìm kiếm tiếp theo từ khi kết thúc trận đấu trước.
  • i là viết tắt của tìm kiếm không phân biệt chữ hoa chữ thường làm cho toàn bộ biểu thức không phân biệt chữ hoa chữ thường (ví dụ: / xyz / i sẽ trùng với XyZ).
  • Tiếp theo, ta sử dụng một điều kiện để kiểm tra xem có bất kỳ trường hợp phù hợp nào được tìm thấy hay không. Phương thức .match() được sử dụng ở trên trả về một mảng các mục phù hợp nếu tìm thấy các mục phù hợp và null nếu không tìm thấy chúng. Do đó trong điều kiện, nếu matchingInstances đánh giá lại một giá trị truthy ( nghĩa là một loạt các trận đấu được tìm thấy), ta ghi lại một thông điệp được định dạng hiển thị số nguyên âm mà là giống như độ dài của mảng. Sau đó, ta cũng trả lại số. Mặt khác, nếu nó đánh giá là giá trị sai, ta trả về 0 vì điều đó nghĩa là không tìm thấy kết quả phù hợp nào.

Đánh giá & Tóm tắt

Bây giờ ta đã triển khai thành công một thuật toán đếm số nguyên âm trong một chuỗi văn bản trong JavaScript.

Hãy đánh giá cả hai phương pháp được sử dụng. Cách tiếp cận lặp đi lặp lại mặc dù không ngắn gọn bằng cách khác nhưng có thể là một cách tiếp cận hợp lý hơn, đặc biệt là đối với người mới bắt đầu. Tuy nhiên, kết quả cho thấy, phương pháp regex được tối ưu hóa tốt hơn.
kết quả trong bộ đếm nguyên âm hiển thị trường hợp thử nghiệm với regex có tối ưu hóa tốt hơn

Bạn có thể sử dụng bộ đếm nguyên âm trường hợp thử nghiệm này để tự chạy các bài kiểm tra.


Tags:

Các tin liên quan

Cách gói một gói JavaScript Vanilla để sử dụng trong React
2019-12-12
Cách phát triển một trình tải lên tệp tương tác với JavaScript và Canvas
2019-12-12
Cách sử dụng map (), filter () và Reduce () trong JavaScript
2019-12-12
Giải thích về lập trình chức năng JavaScript: Ứng dụng một phần và làm xoăn
2019-12-12
Giới thiệu về Closures và Currying trong JavaScript
2019-12-12
Bắt đầu với các hàm mũi tên ES6 trong JavaScript
2019-12-12
Cách sử dụng phép gán cấu trúc hủy trong JavaScript
2019-12-12
Giải thích về lập trình chức năng JavaScript: Kết hợp & truyền tải
2019-12-12
Cách sử dụng .every () và .some () để điều khiển mảng JavaScript
2019-12-12
Chuyển đổi Mảng sang Chuỗi trong JavaScript
2019-12-05