Viết hàm nhận mảng chuỗi, xóa các phần tử có chữ cái đầu tiên trùng với phần tử trước đó đã giữ lại (chỉ giữ lại lần xuất hiện đầu tiên của mỗi chữ cái đầu).
Ví dụ
Mảng gốc:
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
Kết quả sau khi lọc:
[ 'Apple', 'Jack', 'Car' ]
Giải thích: 'Army' bị xóa vì 'A' đã có ở 'Apple'; 'Jason' bị xóa vì 'J' đã có ở 'Jack'.
Triển khai
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
const deleteSameLetterWord = arr => {
const seenFirstLetters = new Map();
// Duyệt ngược để splice an toàn (không ảnh hưởng index của phần tử chưa duyệt)
for (let i = arr.length - 1; i >= 0; i--) {
const firstLetter = arr[i][0];
if (seenFirstLetters.has(firstLetter)) {
arr.splice(i, 1);
} else {
seenFirstLetters.set(firstLetter, true);
}
}
};
deleteSameLetterWord(arr);
console.log(arr);
Kết quả
[ 'Apple', 'Jack', 'Car' ]
Lưu ý quan trọng: Mã gốc trong ví dụ duyệt từ đầu và dùng splice ngay lập tức, gây lỗi bỏ qua phần tử do index dịch chuyển. Cách an toàn là duyệt ngược (từ cuối về đầu) hoặc tạo mảng mới.
Cách hiện đại, không biến đổi mảng gốc (Immutable)
const filterUniqueFirstLetter = arr => {
const seen = new Set();
return arr.filter(word => {
const first = word[0];
if (seen.has(first)) return false;
seen.add(first);
return true;
});
};
const arr = ['Apple', 'Jack', 'Army', 'Car', 'Jason'];
console.log(filterUniqueFirstLetter(arr)); // [ 'Apple', 'Jack', 'Car' ]
Cách này rõ ràng, an toàn và tuân thủ lập trình hàm.