_.compact(array) (Underscore/Lodash) trả về mảng mới chỉ chứa truthy values — loại bỏ false, null, 0, "", undefined, NaN.
Cú pháp
_.compact(array);
Ví dụ
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js"></script>
<script>
const result = _.compact(["zero", 1, NaN, false, 2, '', 3, undefined]);
document.write(result); // "zero,1,2,3"
</script>
Kết quả
zero,1,2,3
Lưu ý: String "0" và "NaN" là TRUTHY
_.compact(["0", 1, 'NaN', false, 2, '', 3, undefined]);
// ["0", 1, "NaN", 2, 3] — "0" và "NaN" là string non-empty → truthy
Native Alternative (Không cần library)
1. filter(Boolean) — Ngắn gọn, phổ biến
const arr = ["zero", 1, NaN, false, 2, '', 3, undefined];
const compacted = arr.filter(Boolean);
// ["zero", 1, 2, 3] — Boolean là function chuyển đổi truthy/falsy
2. filter(x => x) — Tường minh hơn
const compacted = arr.filter(x => x); // Tương tự
So sánh
| Phương pháp | Dependency | Hiệu suất | Đọc hiểu |
|---|---|---|---|
_.compact(arr) | Lodash/Underscore | Tốt | Rõ ý định |
arr.filter(Boolean) | Không (Native) | Tốt | Idiomatic JS |
arr.filter(x => x) | Không (Native) | Tốt | Rõ ràng |
Lưu ý
filter(Boolean)cũng loại bỏ0— nếu muốn giữ0(ví dụ: count), cần custom filter.- Object/Array rỗng (
{},[]) là truthy — không bị loại. _.compactchỉ làm shallow — không đệ quy vào nested array.
Compact deep (Đệ quy) — Custom
function deepCompact(arr) {
return arr
.map(item => Array.isArray(item) ? deepCompact(item) : item)
.filter(x => x !== null && x !== undefined && x !== '' && x !== false && !Number.isNaN(x));
// Giữ 0 nếu cần: thêm x !== 0
}