Số lượng bằng 0 hoặc cờ false biến mất sau bước “làm sạch” mảng. filter(Boolean) ngắn gọn, nhưng điều kiện giữ dữ liệu của nó có thể khác yêu cầu sản phẩm. Trước khi dùng, hãy viết rõ giá trị nào thực sự là thiếu và giá trị nào có ý nghĩa.
1. Boolean không phải bộ kiểm tra dữ liệu hợp lệ
const values = [0, false, '', null, undefined, '0', ' ', 3];
console.log(JSON.stringify(values.filter(Boolean))); // ["0"," ",3]
console.log(values.length); // 8
filter giữ phần tử khi callback trả giá trị truthy; Boolean chuyển đầu vào thành boolean. Vì vậy số 0, false và chuỗi rỗng bị loại, trong khi '0' và chuỗi chứa dấu cách vẫn được giữ. Đối chiếu MDN filter và MDN Boolean.
Trong một bảng thống kê, 0 có thể nghĩa là đã đo và không có sự kiện; null có thể nghĩa là chưa có dữ liệu. Xóa cả hai rồi tính số bản ghi sẽ làm mất sự phân biệt này. Tương tự, false là một lựa chọn tắt rõ ràng nếu schema dùng boolean.
2. Chỉ bỏ null và undefined khi đó là contract
const values = [0, false, '', null, undefined, '0'];
const present = values.filter(value => value !== null && value !== undefined);
console.log(JSON.stringify(present)); // [0,false,"","0"]
console.log(present.length); // 4
Điều kiện này giữ nguyên giá trị và kiểu của phần tử còn lại. Nó không xác nhận số hợp lệ, chuỗi hợp lệ hay cấu trúc object. Ví dụ, NaN vẫn được giữ; một object thiếu trường bắt buộc cũng không bị loại. Dùng nó cho bước loại giá trị thiếu, sau đó kiểm tra schema theo nhu cầu.
Nếu dữ liệu sai phải được báo về nguồn, đừng âm thầm bỏ hàng. Có thể tách danh sách hợp lệ và danh sách lỗi kèm chỉ số gốc để người nhập sửa đúng bản ghi. Lọc bỏ có chủ đích khác với xác nhận toàn bộ đầu vào đã hợp lệ.
3. Với nhãn văn bản, xác định cả kiểu và quy tắc khoảng trắng
const input = ['', ' ', ' ready ', null, 42, '0'];
const labels = input
.filter(value => typeof value === 'string')
.map(value => value.trim())
.filter(value => value.length > 0);
console.log(JSON.stringify(labels)); // ["ready","0"]
Đây là chính sách minh họa cho danh sách nhãn: bỏ đầu vào không phải chuỗi, trim hai đầu và bỏ nhãn rỗng. Số 42 không được tự đổi thành chữ. Với mã định danh hoặc văn bản cần giữ dấu cách, hãy chọn chính sách khác thay vì dùng chung helper cho mọi trường.
Đầu ra đã thay đổi nội dung ' ready ' thành 'ready'. Nếu chỉ cần kiểm tra mà vẫn phải giữ nguyên văn bản, dùng predicate kiểm tra độ dài sau trim và trả lại phần tử gốc, không map thành chuỗi mới.
4. Predicate vô tình trả số cũng có thể làm mất hàng
const rows = [{ count: 0 }, { count: 2 }, { count: -1 }];
const accidental = rows.filter(row => row.count);
const nonnegative = rows.filter(row => row.count >= 0);
console.log(JSON.stringify(accidental.map(row => row.count))); // [2,-1]
console.log(JSON.stringify(nonnegative.map(row => row.count))); // [0,2]
Ví dụ cho thấy “có giá trị truthy” không tương đương “số không âm”. Dữ liệu rows ở đây đã biết là object với count dạng số. Với dữ liệu API tùy ý, cần kiểm tra cả phần tử lẫn kiểu và tính hữu hạn của count trước khi so sánh.
5. Chọn điều kiện theo dữ liệu cần giữ
| Nhu cầu | Điều cần làm rõ |
|---|---|
| Bỏ giá trị thiếu | Chỉ null và undefined hay có giá trị khác? |
| Bỏ nhãn trắng | Có chấp nhận trim và bỏ dữ liệu sai kiểu? |
| Lọc số lượng | 0, số âm và số không hữu hạn có hợp lệ? |
| Lọc bản ghi | Schema bắt buộc những trường nào? |
Test nên có 0, false, chuỗi rỗng, chuỗi trắng, null và undefined trong cùng bộ dữ liệu. Đừng dùng chỉ các giá trị 1 và 2 rồi kết luận bước làm sạch đã đúng.
Tám khối mã Việt–Anh đã chạy bằng Node.js, kèm kiểm tra bảo toàn 0, false, NaN và tham chiếu object. Chưa tích hợp form hoặc API thực tế.




Chưa có bình luận. Hãy là người đầu tiên chia sẻ ý kiến.