Bạn có thể lặp qua một tập hợp trong JavaScript không?
Đối với nhiều thứ trong JavaScript, không có một cách duy nhất để đạt được chúng. Một việc đơn giản như lặp qua từng ký tự trong chuỗi là một trong số đó. Hãy cùng khám phá một số phương pháp và thảo luận về những mặt tích cực và hạn chế của chúng Show Trước khi bắt đầu, chúng ta cần quay lại một câu hỏi cơ bản hơn nhiều Cách truy cập một ký tự đơn của chuỗi Ngày nay với ECMAScript 2015 (ES6), có hai cách để truy cập một ký tự charAt()Phương pháp này của đối tượng chuỗi đã xuất hiện được một thời gian và có thể được coi là cách tiếp cận cổ điển. Nó được hỗ trợ ngay cả trong các trình duyệt cũ nhất ký hiệu khungPhương pháp thứ hai là truy cập một ký tự thông qua ký hiệu dấu ngoặc Cách tiếp cận này đã được giới thiệu với ECMAScript 2015 và có vẻ thuận tiện hơn. Hơn nữa, nó cho phép bạn coi một chuỗi giống như một cấu trúc giống như mảng. Điều này cho phép một vài phương thức lặp lại, như chúng ta sẽ sớm thấy Phương pháp nào là thích hợp hơn?Nhược điểm của Điều này có thể gây nhầm lẫn, đặc biệt là vì sẽ không có cảnh báo Theo ý kiến cá nhân của tôi, ký hiệu ngoặc thuận tiện hơn để viết và đọc. Các vấn đề về khả năng tương thích nên được giải quyết bằng cách dịch mã thay vì không sử dụng tính năng mong muốn Các cách phổ biến để lặp chuỗi Danh sách các kỹ thuật sau đây không được yêu cầu là đầy đủ. Nó sẽ hiển thị một số phương pháp được sử dụng thường xuyên nhất Để chứng minh quá trình xử lý các ký tự đơn trong chuỗi của chúng tôi, chúng tôi sẽ sử dụng hàm sau cho vòng lặpCách tiếp cận cổ điển — một vòng lặp Mặc dù viết và đọc hơi rườm rà nhưng đây là phương pháp được biết đến nhanh nhất cho…củaCâu lệnh này đã được giới thiệu với ECMAScript 2015 và có thể được sử dụng với các đối tượng có thể lặp lại. Sẽ thuận tiện hơn khi viết vòng lặp cho mỗi()Đây là phiên bản chức năng của vòng lặp Một nhược điểm là bạn cần chuyển đổi chuỗi thành một mảng trước khi lặp lại. Nếu hiệu suất thực sự quan trọng trong trường hợp sử dụng của bạn (và thường thì không), thì đó có thể không phải là lựa chọn đầu tiên của bạn Phần kết luận Cũng như nhiều kỹ thuật trong JavaScript, vấn đề chủ yếu là sở thích khi quyết định sử dụng kỹ thuật nào. Tuy nhiên, hãy lưu ý các tác động về tốc độ của quá trình chuyển đổi chuỗi thành mảng cũng như các vấn đề về tính tương thích của ký hiệu dấu ngoặc Tôi khuyên bạn nên chọn kỹ thuật dễ đọc nhất và chỉ quan tâm đến việc tối ưu hóa tốc độ nếu bạn gặp vấn đề về hiệu suất và giải quyết các vấn đề về tính tương thích thông qua dịch mã Bắt đầu với ES2015, chúng tôi có một loại vòng lặp mới để lặp qua các đối tượng có thể lặp lại. Vòng lặp const arr = [1,2,3]; 7 mới là một loại vòng lặp mới cho phép chúng ta lặp qua bất kỳ đối tượng có thể lặp nào mà không cần sử dụng vòng lặp const arr = [1,2,3]; 8 thông thường, vòng lặp const arr = [1,2,3]; 9 hoặc sử dụng hàm const arr = [1,2,3]; 0 trong trường hợp mảng. Nó có thể được sử dụng trực tiếp để lặp qua bất kỳ đối tượng có thể lặp nào, bao gồm các đối tượng được tích hợp sẵn như Chuỗi, Mảng, các đối tượng giống mảng như const arr = [1,2,3]; 1 và const arr = [1,2,3]; 2 , const arr = [1,2,3]; 3 , const arr = [1,2,3]; 4 , const arr = [1,2,3]; 5 và bất kỳ lần lặp nào do người dùng định nghĩa. Các trình lặp do người dùng xác định bao gồm các thực thể như trình tạo và trình lặpNếu chúng ta muốn sử dụng vòng lặp const arr = [1,2,3]; 7 để lặp qua một đối tượng có thể lặp lại, chúng ta có thể viết nó bằng cú pháp saufor (variable of iterable){ const arr = [1,2,3]; 7trong đoạn mã trên là biến đại diện cho từng mục nhập của đối tượng có thể lặp lại đang được lặp lại. Nó có thể được khai báo với const arr = [1,2,3]; 8 , const arr = [1,2,3]; 9 hoặc const str = 'string'; 0. const str = 'string'; 1 là đối tượng nơi các thuộc tính đang được lặp lạiVí dụ: chúng ta có thể sử dụng nó để lặp qua một mảng như trong đoạn mã sau const arr = [1,2,3]; Đoạn mã trên, các câu lệnh const str = 'string'; 2 sẽ ghi nhật ký 1, 2 và 3. Chúng ta có thể thay thế const arr = [1,2,3]; 8 bằng const arr = [1,2,3]; 9 nếu chúng ta muốn gán biến mà chúng ta đã sử dụng để lặp lại trong vòng lặp const arr = [1,2,3]; 7. Ví dụ, chúng ta có thể viếtconst arr = [1,2,3]; Đoạn mã trên, các câu lệnh const str = 'string'; 2 sẽ ghi nhật ký 2, 4 và 6 vì chúng tôi đã sử dụng từ khóa const arr = [1,2,3]; 9 để khai báo const str = 'string'; 8 nên chúng tôi có thể sửa đổi const str = 'string'; 8 tại chỗ bằng cách nhân mỗi mục với 2. Chúng tôi không thể gán lại với const arr = [1,2,3]; 8 vì vậy chúng tôi phải sử dụng const arr = [1,2,3]; 9 hoặc const str = 'string'; 0 để khai báo biến mà chúng tôi muốn sửa đổi trong mỗi lần lặpChúng ta cũng có thể lặp qua các chuỗi. Nếu chúng ta làm điều đó, tất cả chúng ta đều nhận được từng ký tự của chuỗi trong mỗi lần lặp. Ví dụ: nếu chúng tôi có mã bên dưới const str = 'string'; Sau đó, chúng tôi nhận được các ký tự riêng lẻ của const arr = new Uint8Array([0x00, 0x2f]); 3 được đăng nhập vào mỗi dòngTương tự như vậy, chúng ta có thể lặp qua TypedArrays, chứa dữ liệu nhị phân được biểu thị bằng một chuỗi số ở định dạng thập lục phân. Ví dụ, chúng ta có thể viết đoạn mã sau const arr = new Uint8Array([0x00, 0x2f]); Trong ví dụ trên, const str = 'string'; 2 sẽ ghi 0 và 47. Lưu ý rằng giá trị đã ghi ở định dạng thập phân nhưng giá trị đã nhập ở định dạng thập lục phânNếu chúng tôi lặp lại trên Bản đồ, thì chúng tôi sẽ nhận được từng mục nhập của Bản đồ. Ví dụ: chúng ta có thể viết đoạn mã sau để lặp lại trên Bản đồ const map = new Map([['a', 2], ['b', 4], ['c', 6]]); Nếu chúng tôi đăng nhập các mục, chúng tôi nhận được const arr = new Uint8Array([0x00, 0x2f]); 5, const arr = new Uint8Array([0x00, 0x2f]); 6 và const arr = new Uint8Array([0x00, 0x2f]); 7. Bản đồ bao gồm các cặp khóa-giá trị làm mục nhập của chúng. Khi chúng tôi lặp lại trên Bản đồ, chúng tôi nhận được khóa là phần tử đầu tiên và giá trị là phần tử thứ hai là mỗi mục nhập. Để lấy khóa và giá trị của mỗi mục nhập vào biến riêng của nó, chúng ta có thể sử dụng toán tử hủy, như trong đoạn mã sauconst map = new Map([['a', 2], ['b', 4], ['c', 6]]); Sau đó, khi chúng tôi đăng nhập các mục, chúng tôi nhận được const arr = new Uint8Array([0x00, 0x2f]); 8, const arr = new Uint8Array([0x00, 0x2f]); 9 và const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 0Chúng ta cũng có thể sử dụng vòng lặp const arr = [1,2,3]; 7 cho Sets. Ví dụ: chúng ta có thể lặp qua Set bằng cách thực hiện như sauconst set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); Chúng tôi đặt rằng chúng tôi nhận được 1, 2, 3, 4, 5 và 6 được ghi lại do hàm tạo Set tự động loại bỏ các mục nhập trùng lặp bằng cách giữ giá trị xuất hiện đầu tiên trong Tập hợp và loại bỏ lần xuất hiện sau của cùng một giá trị Vòng lặp const arr = [1,2,3]; 7 cũng hoạt động để lặp qua đối tượng const arr = [1,2,3]; 1, là đối tượng toàn cục có các đối số được truyền vào hàm khi hàm được gọi. Ví dụ: nếu chúng ta viết đoạn mã sau(function() { Chúng tôi thấy rằng chúng tôi thấy 1, 2, 3, 4, 5 và 6 được ghi lại vì đây là những gì chúng tôi đã truyền vào khi chúng tôi gọi hàm. Lưu ý rằng điều này chỉ hoạt động đối với các chức năng thông thường vì ngữ cảnh của const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 4 phải được thay đổi thành chức năng được gọi thay vì const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 5. Các hàm mũi tên không thay đổi nội dung của const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 4, vì vậy chúng ta sẽ không nhận được các đối số chính xác khi chúng ta chạy cùng một vòng lặp bên trong một hàm mũi tênNgoài ra, chúng ta có thể lặp qua một danh sách các đối tượng Nút DOM, được gọi là const arr = [1,2,3]; 2. Ví dụ: một trình duyệt có triển khai const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 8 không, sau đó chúng ta có thể sử dụng vòng lặp const arr = [1,2,3]; 7 như trong đoạn mã sauconst divs = document.querySelectorAll('div'); Trong đoạn mã trên, chúng tôi đã ghi lại tất cả các phần tử const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 0 có trong tài liệuVới const arr = [1,2,3]; 7 vòng lặp, chúng ta có thể kết thúc vòng lặp bằng cách sử dụng các câu lệnh const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 2 , const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 3 hoặc const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 4. Trình lặp sẽ đóng trong trường hợp này, nhưng quá trình thực thi sẽ tiếp tục bên ngoài vòng lặp. Ví dụ, nếu chúng ta viếtconst arr = [1,2,3]; 0Đoạn code trên chúng ta chỉ log ‘a’ vì có câu lệnh break ở cuối vòng lặp const arr = [1,2,3]; 7 nên sau lần lặp đầu tiên iterator sẽ đóng và vòng lặp kết thúcChúng ta có thể lặp qua các trình tạo, đây là các hàm đặc biệt trả về hàm trình tạo. Hàm tạo trả về giá trị tiếp theo của một đối tượng có thể lặp lại. Nó được sử dụng để cho phép chúng ta lặp qua một tập hợp các đối tượng bằng cách sử dụng hàm tạo trong vòng lặp const arr = [1,2,3]; 7Chúng ta cũng có thể lặp qua một trình tạo tạo ra các giá trị vô hạn. Chúng ta có thể có một vòng lặp vô hạn bên trong trình tạo để tiếp tục trả về các giá trị mới. Bởi vì câu lệnh const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 7 không chạy cho đến khi giá trị tiếp theo được yêu cầu, chúng tôi có thể tiếp tục chạy một vòng lặp vô hạn mà không làm hỏng trình duyệt. Ví dụ, chúng ta có thể viếtconst arr = [1,2,3]; 1Nếu chúng tôi chạy mã ở trên, chúng tôi thấy rằng chúng tôi nhận được các số từ 2 đến 1000 được ghi lại. Sau đó, const str = 'string'; 8 lớn hơn 1000, do đó câu lệnh const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 2 được chạy. Chúng tôi không thể sử dụng lại trình tạo sau khi nó đã đóng, vì vậy nếu chúng tôi viết một cái gì đó như sauconst arr = [1,2,3]; 2Vòng lặp thứ hai sẽ không chạy vì vòng lặp được tạo bởi trình tạo đã bị đóng bởi vòng lặp đầu tiên với câu lệnh const map = new Map([['a', 2], ['b', 4], ['c', 6]]); 2Chúng ta có thể lặp lại các đối tượng có thể lặp lại khác có phương thức được biểu thị bằng Ký hiệu const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 1 được xác định. Ví dụ: nếu chúng ta có đối tượng lặp sau được xác địnhconst arr = [1,2,3]; 3Sau đó, chúng ta có thể chạy vòng lặp bên dưới để hiển thị nhật ký kết quả được tạo const arr = [1,2,3]; 4Khi chúng tôi chạy nó, sẽ thấy 0 đến 9 được ghi lại khi const str = 'string'; 2 được chạy trong vòng lặp ở trênĐiều quan trọng là chúng ta không nhầm lẫn giữa vòng lặp const arr = [1,2,3]; 7 với vòng lặp const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 4. Vòng lặp const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 4 if để lặp qua các khóa cấp cao nhất của các đối tượng bao gồm mọi thứ trong chuỗi nguyên mẫu, trong khi vòng lặp const arr = [1,2,3]; 7 có thể lặp qua bất kỳ đối tượng có thể lặp nào như mảng, Bộ, Bản đồ, đối tượng const arr = [1,2,3]; 1, đối tượng const arr = [1,2,3]; 2 và bất kỳ người dùng nào- Ví dụ: nếu chúng ta có một cái gì đó như const arr = [1,2,3]; 5Sau đó, chúng tôi nhận được 0, 1, 2, 'foo', 'arrProp' và 'objProp' được ghi lại, là các khóa của đối tượng và phương thức được xác định cho đối tượng const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 9. Nó bao gồm tất cả các thuộc tính và phương thức trong chuỗi nguyên mẫu. Nó kế thừa tất cả các thuộc tính và phương thức từ Đối tượng và Mảng đã được thêm vào nguyên mẫu của Đối tượng và Mảng để chúng ta có được tất cả những thứ trong kế thừa chuỗi trong vòng lặp const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 4. Chỉ có vô số thuộc tính được ghi vào đối tượng const set = new Set([1, 1, 2, 3, 3, 4, 5, 5, 6]); 9 theo thứ tự tùy ý. Nó ghi lại chỉ mục và thuộc tính mà chúng tôi đã xác định trong (function() { 2và (function() { 3như (function() { 4và (function() { 5Để chỉ lặp qua các thuộc tính không kế thừa từ nguyên mẫu của một đối tượng, chúng ta có thể sử dụng (function() { 6 để kiểm tra xem thuộc tính có được xác định trên chính đối tượng đó khôngconst arr = [1,2,3]; 6(function() { 4 và (function() { 5 được bỏ qua vì chúng được kế thừa từ các đối tượng (function() { 2 và (function() { 3 tương ứngVòng lặp const arr = [1,2,3]; 7 là một loại vòng lặp mới cho phép chúng ta lặp qua bất kỳ đối tượng lặp nào mà không cần sử dụng vòng lặp const arr = [1,2,3]; 8 thông thường, vòng lặp const arr = [1,2,3]; 9 hoặc sử dụng hàm const arr = [1,2,3]; 0 trong trường hợp mảng. Nó có thể được sử dụng trực tiếp để lặp qua bất kỳ đối tượng có thể lặp nào, bao gồm các đối tượng được tích hợp sẵn như Chuỗi, Mảng, các đối tượng giống mảng như const arr = [1,2,3]; 1 và const arr = [1,2,3]; 2 , const arr = [1,2,3]; 3 , const arr = [1,2,3]; 4 , const arr = [1,2,3]; 5 và bất kỳ lần lặp nào do người dùng định nghĩa. Các trình lặp do người dùng xác định bao gồm các thực thể như trình tạo và trình lặp. Đây là một vòng lặp tiện dụng vì nó cho phép chúng ta vượt qua bất kỳ đối tượng có thể lặp nào thay vì chỉ các mảng. Bây giờ chúng ta có một câu lệnh lặp hoạt động với đối tượng iterable
Chúng ta có thể lặp lại tập hợp trong JavaScript không?Để lặp lại các phần tử của Tập hợp trong JavaScript, gọi phương thức values() trên tập hợp này để trả về một trình vòng lặp và sử dụng vòng lặp for-of trên trình lặp này.
Bạn có thể lặp qua các tập hợp không?Không có cách nào để lặp lại một tập hợp mà không có trình lặp , ngoài việc truy cập cấu trúc cơ bản chứa dữ liệu thông qua phản chiếu và sao chép mã do Set#iterator cung cấp.
Bạn có thể lặp qua một tập hợp có vòng lặp for không?Bạn không thể truy cập các mục trong một tập hợp bằng cách tham khảo chỉ mục, vì các tập hợp không có thứ tự nên các mục không có chỉ mục. Nhưng bạn có thể lặp qua các mục đã đặt bằng cách sử dụng vòng lặp for hoặc hỏi xem một giá trị cụ thể có tồn tại trong một tập hợp hay không bằng cách sử dụng từ khóa in.
Làm cách nào để sử dụng forEach trên trường quay trong JavaScript?Phương thức Set forEach() trong JavaScript thực thi hàm đã chỉ định một lần cho mỗi giá trị trong đối tượng Set. Nó duy trì một thứ tự chèn. Không giống như Bản đồ, đối tượng Set không sử dụng khóa bên ngoài. . setObj. forEach(hàm gọi lại(value1, value2, Set) { // trình lặp của bạn [, thisArg]) |