Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Loại bỏ giá trị falsy khỏi mảng trong JavaScript (_.compact)

_.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ápDependencyHiệu suấtĐọc hiểu
_.compact(arr)Lodash/UnderscoreTốtRõ ý định
arr.filter(Boolean)Không (Native)TốtIdiomatic JS
arr.filter(x => x)Không (Native)TốtRõ 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.
  • _.compact chỉ 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
}