Lập trình · 20/10/2026

Object.fromEntries trong JavaScript: tránh mất dữ liệu khi trùng khóa

Danh sách có hai giá trị cho cùng một khóa nhưng object cuối cùng chỉ còn một. Object.fromEntries là cách chuyển đổi gọn, song object không giữ nhiều thuộc tính riêng biệt cùng một khóa. Trước khi dùng trong pipeline dữ liệu, cần chọn rõ chính sách khi khóa bị lặp.

Object.fromEntries trong JavaScript: tránh mất dữ liệu khi trùng khóa

Danh sách có hai giá trị cho cùng một khóa nhưng object cuối cùng chỉ còn một. Object.fromEntries là cách chuyển đổi gọn, song object không giữ nhiều thuộc tính riêng biệt cùng một khóa. Trước khi dùng trong pipeline dữ liệu, cần chọn rõ chính sách khi khóa bị lặp.

1. Giá trị sau ghi đè giá trị trước

const entries = [['mode', 'light'], ['mode', 'dark']];
const options = Object.fromEntries(entries);
console.log(options.mode); // dark
console.log(Object.keys(options).length); // 1
console.log(entries.length); // 2

Ví dụ tự kiểm chứng rằng danh sách đầu vào vẫn còn hai cặp, còn kết quả chỉ có một thuộc tính mode. Đây không phải thao tác gom giá trị thành mảng. Nếu hệ thống cho phép cấu hình sau ghi đè cấu hình trước, hành vi này có thể phù hợp; nếu khóa trùng là lỗi nhập liệu, cần phát hiện trước khi chuyển đổi.

2. Khóa khác kiểu có thể thành cùng một thuộc tính

const entries = [[1, 'number key'], ['1', 'string key']];
const object = Object.fromEntries(entries);
const map = new Map(entries);
console.log(object['1']); // string key
console.log(Object.keys(object).length); // 1
console.log(map.size); // 2

Trong object, khóa số 1 được chuyển thành chuỗi '1'. Map của ví dụ giữ hai khóa khác kiểu. Nếu dữ liệu cần phân biệt khóa số và khóa chuỗi, đừng chuyển sang object mà chưa xác định cách biểu diễn. Với ID từ API, có thể quy định khóa luôn là chuỗi ngay từ bước validation.

3. URLSearchParams có thể chứa nhiều cặp cùng tên

const params = new URLSearchParams('tag=linux&tag=git&page=2');
console.log(Object.fromEntries(params).tag); // git
console.log(params.get('tag')); // linux
console.log(JSON.stringify(params.getAll('tag'))); // ["linux","git"]

Ba cách đọc trả lời những câu hỏi khác nhau: object sau chuyển đổi giữ giá trị cuối, get lấy giá trị đầu, còn getAll giữ danh sách. Khi bộ lọc cho phép chọn nhiều tag, dùng getAll cho trường đó. Không suy ra hợp đồng API chỉ từ cách frontend tạo object; cần thống nhất cả cách backend đọc tham số lặp.

4. Nếu khóa phải duy nhất, kiểm tra trước khi tạo object

Helper dưới đây chỉ nhận mảng các cặp hai phần tử và yêu cầu khóa là chuỗi. Nó từ chối khóa trùng chính xác, phân biệt chữ hoa với chữ thường và không trim khóa. Đây là chính sách minh họa cho cấu hình nhỏ, không phải bộ chuẩn hóa mọi loại dữ liệu.

function uniqueStringEntries(entries) {
  if (!Array.isArray(entries)) throw new TypeError('Array required');
  const seen = new Set();
  for (const pair of entries) {
    if (!Array.isArray(pair) || pair.length !== 2 || typeof pair[0] !== 'string') {
      throw new TypeError('Expected [string, value] pairs');
    }
    if (seen.has(pair[0])) throw new Error('Duplicate key');
    seen.add(pair[0]);
  }
  return Object.fromEntries(entries);
}
console.log(uniqueStringEntries([['mode', 'dark']]).mode); // dark
try {
  uniqueStringEntries([['mode', 'light'], ['mode', 'dark']]);
} catch (error) {
  console.log(error.message); // Duplicate key
}

Hàm kiểm tra cấu trúc cặp và tính duy nhất của khóa, chưa kiểm tra ý nghĩa của từng value. Nếu cấu hình mode chỉ cho phép light hoặc dark, thêm validation theo schema ở bước riêng. Khi mọi giá trị đều cần được giữ lại, nên giữ danh sách cặp hoặc chọn cấu trúc khóa tới mảng, thay vì từ chối dữ liệu hợp lệ.

5. Kiểm thử trước khi đổi cấu trúc

  • Danh sách rỗng, một cặp và nhiều khóa khác nhau.
  • Khóa lặp với giá trị giống nhau và khác nhau.
  • Khóa số so với khóa chuỗi.
  • Tham số URL xuất hiện nhiều lần.
  • Cặp sai cấu trúc và value chưa qua validation.

Tám khối ví dụ Việt–Anh đã chạy bằng Node.js, kèm kiểm tra helper với khóa trùng và đầu vào sai. Chưa kiểm thử cách framework backend diễn giải query string. Tham khảo MDN Object.fromEntries và URL Standard về URLSearchParams.

Thảo luận

Bình luận 0

Đăng nhập để bình luận

Bạn cần có tài khoản để tham gia thảo luận và trả lời độc giả khác.

Đăng nhậpĐăng ký

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