- vừa được xem lúc

Cách để xoá phần tử trùng lặp của mảng trong ES6

0 0 8

Người đăng: Nguyễn Vũ Hải

Theo Viblo Asia

Trong bài viết này, mình sẽ giới thiệu 3 cách để lọc phần tử trùng lặp từ một mảng và trả về chỉ các phần tử duy nhất. Sở thích của mình là sử dụng Set vì cú pháp ngắn gọn và cực kì đơn giản

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; // 1: "Set"
[...new Set(array)]; // 2: "Filter"
array.filter(item, index) => array.indexOf(item) === index); // 3: "Reduce"
array.reduce(unique, item) => unique.includes(item) ? unique : [...unique, item], []); // RESULT: // ['🐣', 1, 2, 3];

1. Sử dụng Set:

Hãy để mình bắt đầu trước bằng cách giải thích Set là gì:

Set là một đối tượng dữ liệu mới được giới thiệu trong ES6. Vì Set chỉ cho bạn lưu trữ các giá trị duy nhất. Khi bạn đưa nó vào trong một mảng, nó sẽ xoá tất cả các giá trị trùng lặp.

Okays, quay lại đoạn code ở trên và kiểm tra xem chuyện gì xảy ra. Có 2 thứ sẽ xảy ra ở đây:

  1. Đầu tiên, chúng ta tạo mới một phần tử Set và đưa nó vào một mảng. Vì Set chỉ cho phép giá trị duy nhất, tất cả trùng lặp sẽ bị xoá

  2. Bây giờ các giá trị trùng lặp đã bị mất, chúng ta sẽ hoán đổi lại sang một mảng bằng cách sử dụng phép toán ...

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; // Step 1
const uniqueSet = new Set(array);
// Set { '🐣', 1, 2, 3 } // Step 2
const backToArray = [...uniqueSet];
// ['🐣', 1, 2, 3]

Biến đổi Set đến một mảng sử dụng Array.from

Hoặc bạn có thể sử dụng Array.from để biến đổi một Set vào trong một mảng:

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; Array.from(new Set(array)); // ['🐣', 1, 2, 3]

2. Sử dụng filter:

Để hiểu được tuỳ chọn này, chúng ta sẽ đi qua 2 phương thức đang làm: indexOffilter

indexOf

Phương thức indexOf trả về vị trí (index) đầu tiên nó tìm thấy của phần tử được cung cấp từ mảng.

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; array.indexOf('🐣'); // 0
array.indexOf('1'); // 1
array.indexOf('2'); // 2
array.indexOf('3'); // 5

filter

Phương thức filter() tạo ra một mảng mới các phần tử thoả mãn điều kiện mà chúng ta cung cấp. Nói cách khác, nếu phần tử thoả mãn và trả về true, nó sẽ được chứa trong mảng đã được lọc. Và bất cứ phần tử nào không thoả mãn, trả về false, nó sẽ không nằm trong mảng đã được lọc

Hãy đi từng bước và xem chuyện gì xảy ra.

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; array.filter((item, index) => { console.log( // a. Item item, // b. Index index, // c. indexOf array.indexOf(item), // d. Condition array.indexOf(item) === index, ); return array.indexOf(item) === index
});

Bên dưới là đầu ra từ console.log chỉ ra ở trên. Giá trị trùng lặp là nơi index không khớp với indexOf. Vì thế trong các trường hợp đó, điều kiện sẽ false và sẽ không nằm trong mảng được filter

Item Index indexOf Condition
🐣 0 0 true
1 1 1 true
2 2 2 true
🐣 3 0 false
🐣 4 0 false
3 5 5 true

Lấy ra giá trị trùng lặp

Chúng ta cũng có thể sử dụng phương thức filter để lấy ra các giá trị trùng lặp từ mảng. Chúng ta cũng có thể làm điều này bằng cách đơn giản điều chỉnh điều kiện của chúng ta như sau:

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; array.filter((item, index) => array.indexOf(item) !== index); // ['🐣', '🐣']; 

Lặp lại, nếu chúng ta lặp lại các bước bên trên và nhìn đầu ra:

Item Index indexOf Condition
🐣 0 0 false
1 1 1 false
2 2 2 false
🐣 3 0 true
🐣 4 0 true
3 5 5 false

3. Sử dụng Reduce

Sử dụng phương thức reduce là để giảm số phần tử của mảng và hợp (combine) chúng vào mảng cuối cùng dựa trên một số hàm reducer mà bạn đưa vào

Trong trường hợp này, hàm reduce của chúng ta là sẽ kiểm tra xem mảng cuối cùng chứa item hay không. Nếu nó không, đẩy item đó vào trong mảng cuối cùng. Mặt khác, bỏ qua phần tử đó và chỉ trả lại mảng cuối cùng của chúng ta (về cơ bản bỏ qua phần tử đó).

Reducer luôn luôn khó hiểu hơn một chút. Vì thế đi vào từng trường hợp và nhìn đầu ra của nó:

const array = ['🐣', 1, 2, '🐣', '🐣', 3]; array.reduce((unique, index) => { console.log( // a. Item item, // b. Final Array unique, // c. Condition (Remember it only get pushed if this returns `false`) unique.includes(item), // d. Reducer function result unique.includes(item) ? unique : [...unique, item], ); return unique.includes(item) ? unique : [...unique, item]}, []);
}); //RESULT: //['🐣', 1, 2, 3];

Và đây là đầu ra của console.log:

Item Accumulator (BEFORE Reducer Function) Push to Accumulator? Accumulator (AFTER Reducer Function)
🐣 [ ] Yes [ '🐣' ]
1 [ '🐣' ] Yes [ '🐣' , 1 ]
2 [ '🐣' , 1 ] Yes [ '🐣' , 1, 2 ]
🐣 [ '🐣' , 1, 2 ] No [ '🐣', 1, 2 ]
🐣 [ '🐣' , 1, 2 ] No [ '🐣', 1, 2 ]
3 [ '🐣' , 1, 2 ] Yes [ '🐣', 1, 2, 3 ]

Bình luận

Bài viết tương tự

- vừa được xem lúc

Giới thiệu Typescript - Sự khác nhau giữa Typescript và Javascript

Typescript là gì. TypeScript là một ngôn ngữ giúp cung cấp quy mô lớn hơn so với JavaScript.

0 0 525

- vừa được xem lúc

Cài đặt WSL / WSL2 trên Windows 10 để code như trên Ubuntu

Sau vài ba năm mình chuyển qua code trên Ubuntu thì thật không thể phủ nhận rằng mình đã yêu em nó. Cá nhân mình sử dụng Ubuntu để code web thì thật là tuyệt vời.

0 0 397

- vừa được xem lúc

Đặt tên commit message sao cho "tình nghĩa anh em chắc chắn bền lâu"????

. Lời mở đầu. .

1 1 738

- vừa được xem lúc

Tìm hiểu về Resource Controller trong Laravel

Giới thiệu. Trong laravel, việc sử dụng các route post, get, group để gọi đến 1 action của Controller đã là quá quen đối với các bạn sử dụng framework này.

0 0 358

- vừa được xem lúc

Phân quyền đơn giản với package Laravel permission

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là L

0 0 449

- vừa được xem lúc

Bạn đã biết các tips này khi làm việc với chuỗi trong JavaScript chưa ?

Hi xin chào các bạn, tiếp tục chuỗi chủ đề về cái thằng JavaScript này, hôm nay mình sẽ giới thiệu cho các bạn một số thủ thuật hay ho khi làm việc với chuỗi trong JavaScript có thể bạn đã hoặc chưa từng dùng. Cụ thể như nào thì hãy cùng mình tìm hiểu trong bài viết này nhé (go).

0 0 433