
`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 })),但扩展运算符写法更简洁通用。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 切勿对 Map 使用 Object.keys()、Object.values() 或 for...in —— 它们均无效;
- Map.prototype.keys() 和 Map.prototype.values() 存在,但返回的是迭代器,需手动展开才能用于 .map();
- 若需兼容旧环境(无扩展运算符),可用 Array.from(map1.entries()) 替代。
掌握 Map 的原生迭代方法,是写出健壮、可维护集合操作代码的关键一步。










