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

JavaScript Unique Array ? bài toán quốc dân

0 0 27

Người đăng: Hoang Van Hung

Theo Viblo Asia

Hi các bạn, tiếp tục chuỗi chủ đề xoay quanh JavaScript, hôm nay chúng ta sẽ bàn luận về chủ đề "Unique Array trong Javascript", vấn đề mà mình chắc chắn là trong quá trình làm việc bạn đã gặp phải rất nhiều. Cụ thể như nào chúng ta cùng kéo xuống dưới xem nhé

1. Kết hợp filter() và indexOf()

Ở bài viết trước mình đã giới thiệu phần này tới các bạn đoạn snippet này

function onlyUnique(value, index, self) { return self.indexOf(value) === index;
} const myArray = ['a', 1, 'a', 2, '1'];
const unique = myArray.filter(onlyUnique); console.log(unique); // > ['a', 1, 2, '1']

Theo đó filter() sẽ return về 1 array mới, trong filter() sử dụng điều kiện check trùng lặp để loại ra các phần tử đã tồn tại trong mảng trước đó nên kết quả cuối cùng ta thu được một mảng mới gồm những phần tử là duy nhất

2. Sử dụng Set() kết hợp Spread operator

Trong ES6 có giới thiệu thêm Set() chức năng của nó là nhận đầu vào là các phần tử duy nhất không cho trùng lặp, ta có thể sử dụng như sau

const myArray = ['a', 1, 'a', 2, '1'];
const unique = [...new Set(myArray)]; console.log(unique); // > ['a', 1, 2, '1']

Tuy nhiên bạn hãy cẩn trọng khi sử dụng nó, vì theo như mình biết Set() chỉ đáp ứng tốt với các dữ liệu undefined, null, boolean, string, number. Các array có cấu trúc phức tạp có thể nó sẽ không hoạt động perfect.

3. Sử dụng Set() kết hợp Array.from()

Tương tự như trên ta có thể kết hợp Set() với Array.from() như sau

const myArray = ['a', 1, 'a', 2, '1'];
const unique = Array.from(new Set(myArray)); console.log(unique); // > ['a', 1, 2, '1']

4. Kết hợp Set() với các method của array

Như mình nói ở trên, Set() có thể không hoạt động tốt với các array có cấu trúc phức tạp, vì thế ta có thể kết hợp nó với các method khác của array để cho ra kết quả mong muốn. Ví dụ với map()

const students = [ { name: 'Krunal', age: 26 }, { name: 'Ankit', age: 25 }, { name: 'Krunal', age: 23 }
];
const uniqueArr = [... new Set(students.map(data => data.name))]; console.log(uniqueArr); // > ["Krunal", "Ankit"]

5. Sử dụng Map()

Vẫn ở ví dụ ở mục 4, trong trường hợp bạn muốn return ra 1 array mới chứa các object là uniq theo trường name thì ta làm như sau

const students = [ { name: 'Krunal', age: 26, }, { name: 'Ankit', age: 25, }, { name: 'Krunal', age: 23, },
];
const key = 'name';
const arrayUniqueByKey = [...new Map(students.map((item) => [item[key], item])).values()]; console.log(arrayUniqueByKey); // > Array [Object { name: "Krunal", age: 26 }, Object { name: "Ankit", age: 23 }]

Lưu ý: sử dụng cách này sẽ pick phần tử trùng lặp ở cuối list, như ví dụ trên array mới sẽ chứa name='Krunal' và age=23 chứ không phải name='Krunal' và age=26

1 ví dụ khác

const myArray = [ { id: '93', name: '1' }, { id: '94', name: '2' }, { id: '93', name: '3' }, { id: '94', name: '4' },
]; const data = new Map();
for (const obj of myArray) { data.set(obj.id, obj);
} const unique = [...data.values()];
console.log(unique); // > Array [Object { id: "93", name: "3" }, Object { id: "94", name: "4" }]

6. Định nghĩa mới Array Unique Prototype

Vẫn giữ tư duy cũ đó là lặp qua các phần tử trong mảng và chỉ push vào mảng các phần tử uniq, với vòng lặp for truyền thống ta sẽ tạo mới 1 prototype để sử dụng như sau

Array.prototype.unique = function () { const arr = []; for (let i = 0; i < this.length; i++) { if (!arr.includes(this[i])) { arr.push(this[i]); } } return arr;
}; const ages = [26, 27, 26, 26, 28, 28, 29, 29, 30];
const uniqueAges = ages.unique();
console.log(uniqueAges); // > Array [26, 27, 28, 29, 30]

7. Sử dụng reduce() kết hợp some()

const myArray = [ { id: '93', name: '1' }, { id: '94', name: '2' }, { id: '93', name: '3' }, { id: '94', name: '4' },
]; const unique = myArray.reduce((accumulator, current) => { if (!accumulator.some((x) => x.id === current.id)) { accumulator.push(current); } return accumulator;
}, []); console.log(unique); // > Array [Object { id: "93", name: "1" }, Object { id: "94", name: "2" }]

8. Sử dụng filter() kết hợp findIndex()

const myArray = [ { id: '93', name: '1' }, { id: '94', name: '2' }, { id: '93', name: '3' }, { id: '94', name: '4' },
];
const unique = myArray.filter( (value, index, self) => self.findIndex((m) => m.id === value.id) === index,
); console.log(unique); // > Array [Object { id: "93", name: "1" }, Object { id: "94", name: "2" }]

Kết luận

Trên đây mình đã giới thiệu cho các bạn 1 số cách để lọc ra các giá trị unique trong array, bài viết cũng khá dài rồi có gì chúng ta sẽ gặp lại nhau ở các bài viết khác nhé

Nếu thấy bài viết hay, hãy cho mình +1 upvote nhé. Nếu thích mình hãy nhấn nút follow để biết thêm nhiều thứ hay ho hơn. Chúc bạn thành công và hẹn gặp lại ở bài viết sau nhé !

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 528

- 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 436

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

Một số phương thức với object trong Javascript

Trong Javascript có hỗ trợ các loại dữ liệu cơ bản là giống với hầu hết những ngôn ngữ lập trình khác. Bài viết này mình sẽ giới thiệu về Object và một số phương thức thường dùng với nó.

0 0 158

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

Tìm hiểu về thư viện axios

Giới thiệu. Axios là gì? Axios là một thư viện HTTP Client dựa trên Promise.

0 0 149

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

Imports và Exports trong JavaScript ES6

. Giới thiệu. ES6 cung cấp cho chúng ta import (nhập), export (xuất) các functions, biến từ module này sang module khác và sử dụng nó trong các file khác.

0 0 113

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

Bài toán đọc số thành chữ (phần 2) - Hoàn chỉnh chương trình dưới 100 dòng code

Tiếp tục bài viết còn dang dở ở phần trước Phân tích bài toán đọc số thành chữ (phần 1) - Phân tích đề và những mảnh ghép đầu tiên. Bạn nào chưa đọc thì có thể xem ở link trên trước nhé.

0 0 249