Dòng cấu hình token=abc=def bị tách thành token và abc, làm mất phần =def. Lỗi xuất hiện khi dùng split('=', 2) với kỳ vọng phần tử cuối giữ toàn bộ phần còn lại. Trong JavaScript, limit giới hạn số phần tử trả về; nó không biến phần tử cuối thành một vùng chứa phần dư.
1. limit không phải số lần tách
const line = 'token=abc=def';
console.log(JSON.stringify(line.split('=', 2))); // ["token","abc"]
console.log(JSON.stringify(line.split('='))); // ["token","abc","def"]
console.log(JSON.stringify(line.split('=', 0))); // []
Trong ví dụ, limit bằng 2 chỉ cho phép hai phần tử đầu. Nếu giá trị có thể chứa dấu =, cách tách này làm thay đổi dữ liệu. Khi chuyển mã từ ngôn ngữ khác, đừng suy ra hành vi chỉ dựa trên tên tham số tương tự.
2. Tìm dấu phân cách đầu tiên rồi cắt hai phần
Hàm dưới đây quy định dấu phân cách là chuỗi không rỗng. Không tìm thấy dấu thì trả về một phần tử; tìm thấy thì trả về đúng hai phần, kể cả khi phần đầu hoặc phần sau rỗng. Đây là bộ tách chuỗi đơn giản, không xử lý escape hay dấu nháy.
function splitFirst(text, separator) {
if (typeof text !== 'string' || typeof separator !== 'string') {
throw new TypeError('String arguments required');
}
if (separator.length === 0) throw new RangeError('Empty separator');
const index = text.indexOf(separator);
if (index === -1) return [text];
return [text.slice(0, index), text.slice(index + separator.length)];
}
console.log(JSON.stringify(splitFirst('token=abc=def', '='))); // ["token","abc=def"]
console.log(JSON.stringify(splitFirst('token=', '='))); // ["token",""]
console.log(JSON.stringify(splitFirst('token', '='))); // ["token"]
Việc trả về một hay hai phần giúp nơi gọi phân biệt không có dấu phân cách với có dấu nhưng giá trị rỗng. Không tự trim hai phần nếu khoảng trắng có thể thuộc về giá trị. Nếu hợp đồng cấu hình cho phép bỏ khoảng trắng, thực hiện bước đó riêng và kiểm thử rõ ràng.
3. Không xóa trường rỗng khi vị trí có ý nghĩa
const columns = 'A,,C,'.split(',');
console.log(JSON.stringify(columns)); // ["A","","C",""]
console.log(JSON.stringify(columns.filter(Boolean))); // ["A","C"]
console.log(JSON.stringify(''.split(','))); // [""]
Trong ví dụ tự kiểm chứng này, filter(Boolean) làm C chuyển từ cột thứ ba sang cột thứ hai. Nếu các cột tương ứng với những trường cố định, việc lọc đó có thể ghép sai dữ liệu. Chỉ bỏ phần tử rỗng khi danh sách thực sự không cần giữ vị trí.
4. Nhóm bắt trong regex có thể xuất hiện trong kết quả
console.log(JSON.stringify('A:B;C'.split(/([:;])/))); // ["A",":","B",";","C"]
console.log(JSON.stringify('A:B;C'.split(/[:;]/))); // ["A","B","C"]
Nhóm có ngoặc tròn ở biểu thức đầu giữ dấu phân cách trong kết quả. Khi chỉ muốn chọn một trong nhiều dấu, character class như ví dụ sau không tạo nhóm bắt. Thay regex có thể thay đổi cả số phần tử lẫn ý nghĩa các vị trí, nên cần kiểm tra đầu ra thực tế.
5. Chọn công cụ theo định dạng dữ liệu
split(',') phù hợp với danh sách dấu phẩy có hợp đồng đơn giản. Nó không hiểu quy tắc trường có dấu nháy, dấu phẩy bên trong trường hay dòng mới của CSV. Với CSV thực tế, dùng parser theo định dạng và kiểm thử dữ liệu mẫu. splitFirst cũng không phải parser cho mọi file cấu hình.
- Kiểm tra không có dấu, một dấu và nhiều dấu.
- Giữ trường đầu hoặc cuối rỗng khi cần.
- Thử dấu phân cách nhiều ký tự.
- Từ chối đầu vào sai kiểu và dấu phân cách rỗng theo hợp đồng của helper.
- Xác nhận phần dư còn nguyên, không chỉ số phần tử.
Tám khối ví dụ Việt–Anh đã chạy bằng Node.js, kèm kiểm tra biên cho splitFirst. Không kiểm thử import CSV hay tích hợp trình duyệt. Tham khảo MDN String.split và đặc tả ECMAScript String.prototype.split.




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