JavaScript 中正确遍历 Map 并转换为对象数组的方法

`object.keys()` 无法获取 `map` 实例的键,因为 `map` 不是普通对象,其键值对不作为自有属性暴露;应使用扩展运算符 `...map.entries()` 获取键值对数组后再映射。

在 JavaScript 中,Map 是一个独立的数据结构,并非基于普通对象实现,因此它不继承 Object.prototype 的属性和方法。Object.keys() 只能枚举对象自身的可枚举字符串属性名,而 Map 的键值对存储在内部槽(internal slots)中,并不会变成对象属性——所以 Object.keys(map1) 永远返回空数组 [],这也是你看到 'Keys are []' 的根本原因。

要正确遍历 Map 并生成结构化数据(如 { label, value } 对象数组),推荐使用 Map.prototype.entries() 配合扩展运算符:

const map1 = new Map();
map1.set('111020022AS', true);
map1.set('23t2t363114', false);
map1.set('110AI1123333', true);
map1.set('0000111222', false);

// ✅ 正确:获取 [key, value] 元组数组,再 map 转换
const newArray = [...map1.entries()].map(([label, value]) => ({
  label,
  value
}));

console.log(newArray);
// 输出:
// [
//   { label: '111020022AS', value: true },
//   { label: '23t2t363114', value: false },
//   { label: '110AI1123333', value: true },
//   { label: '0000111222', value: false }
// ]

? 补充说明:

  • map1.entries() 返回一个迭代器(Iterator),[...iterator] 将其展开为二维数组(如 [['key1', val1], ['key2', val2]]);
  • 解构赋值 [label, value] 直接提取每项的键与值,语义清晰且高效;
  • 若需重新构造一个新的 Map(而非数组),可直接传入该二维数组:new Map([...map1.entries()]);
  • 其他等效方式还包括 Array.from(map1, ([k, v]) => ({ label: k, value: v })),但扩展运算符写法更简洁通用。

⚠️ 注意事项:

  • 切勿对 Map 使用 Object.keys()、Object.values() 或 for...in —— 它们均无效;
  • Map.prototype.keys() 和 Map.prototype.values() 存在,但返回的是迭代器,需手动展开才能用于 .map();
  • 若需兼容旧环境(无扩展运算符),可用 Array.from(map1.entries()) 替代。

掌握 Map 的原生迭代方法,是写出健壮、可维护集合操作代码的关键一步。