array.from 转 set 得一维元素数组,转 map 默认得二维键值对数组;set 保留插入顺序且自动去重,map 可通过 keys()/values() 或映射函数定制结果。

Array.from 可以轻松把 Set 和 Map 转成数组,但转换方式不同,结果结构也不同——关键在于理解它们的迭代行为。
转 Set:直接得到元素数组
Set 本身是可迭代对象,且每次迭代返回的是单个值(即元素本身)。所以 Array.from(set) 会生成一个包含所有唯一值的一维数组。
- Set 中的重复值已被自动去重,Array.from 不会再处理重复
- 顺序保持插入顺序,和 for...of 遍历一致
- 如果 Set 里存的是对象,数组中仍是原引用,不是深拷贝
示例:
const set = new Set([1, 2, 2, 'a', {x: 1}]);const arr = Array.from(set); // [1, 2, 'a', {x: 1}]
转 Map:默认得到键值对数组
Map 的默认迭代器返回的是 [key, value] 形式的数组。因此 Array.from(map) 的结果是二维数组,每个子项为长度为 2 的数组。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 结果形如 [[k1,v1], [k2,v2], ...],保留插入顺序
- 若只想提取 key 或 value,需配合映射函数:Array.from(map.keys()) 或 Array.from(map.values())
- 也可用 Array.from(map, ([k, v]) => k * 2) 自定义转换逻辑
示例:
const map = new Map([['a', 1], ['b', 2]]);Array.from(map); // [['a', 1], ['b', 2]]
Array.from(map.keys()); // ['a', 'b']
Array.from(map.values()); // [1, 2]
注意陷阱:避免误用展开语法替代
虽然 [...set] 和 [...map] 效果类似,但 Array.from 更灵活——支持第二个参数作映射,且能处理类数组或带 length 属性的对象。
- Array.from(map, ([k, v]) => `${k}:${v}`) → ['a:1', 'b:2'],展开语法做不到这点
- Array.from({length: 3}, (_, i) => i) → [0, 1, 2],这是创建数组的简洁方式
- 对 null/undefined 会报错,而展开语法在非可迭代对象上也会失败,两者都需确保入参合法
实际场景建议
日常开发中,优先根据目标结构选择方式:
- 去重并转数组 → 用 Array.from(new Set(arr)),比 [...new Set(arr)] 更语义清晰
- 需要加工 Map 数据 → 用 Array.from(map, callback),避免先转二维数组再 map
- 兼容旧环境(如 IE)→ 注意 Array.from 是 ES6 新增,需 polyfill 或用 Babel 转译
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










