array.from不能直接转换普通对象,需配合object.entries()等可迭代方法;object.entries(obj)返回[key,value]二维数组,array.from可直接处理;加map参数可分别提取键或值;直接传普通对象会返回空数组。

Array.from 本身不能直接把普通对象的键值对转成数组,它需要一个可迭代(iterable)的对象。普通对象默认不可迭代,所以得先让它“可迭代”——最常用、最直接的方式是配合 Object.entries() 使用。
用 Object.entries() 配合 Array.from
Object.entries(obj) 返回一个二维数组,每个子数组是 [key, value],这个返回值本身就是可迭代的,Array.from 可以直接处理:
- const obj = { a: 1, b: 2, c: 3 };
- const arr = Array.from(Object.entries(obj));
- console.log(arr); // [['a', 1], ['b', 2], ['c', 3]]
想转成 [key] 或 [value] 单维数组?加 map 参数
Array.from 支持第二个参数作为映射函数,可以一步提取键或值:
- // 只取键
- Array.from(Object.keys(obj)); // ['a', 'b', 'c']
- // 或用 Array.from + map
- Array.from(Object.entries(obj), ([k]) => k); // ['a', 'b', 'c']
- // 只取值
- Array.from(Object.entries(obj), ([, v]) => v); // [1, 2, 3]
注意:别直接传普通对象给 Array.from
下面写法不会按预期工作:
- Array.from({ a: 1, b: 2 }); // [] —— 因为普通对象没有 Symbol.iterator
- Array.from({ length: 2, 0: 'x', 1: 'y' }); // ['x', 'y'] —— 这能用,是因为有 length 和数字索引,模拟类数组,不是通用对象
扩展:让任意对象支持 Array.from(不推荐日常用)
如果真想让某个对象被 Array.from 直接消费,可以手动部署 Symbol.iterator 方法,例如:
- const obj = { a: 1, b: 2 };
- obj[Symbol.iterator] = function* () {
- for (let [k, v] of Object.entries(this)) yield [k, v];
- };
- Array.from(obj); // [['a', 1], ['b', 2]]
但这种方式侵入性强,仅适合特殊场景,日常建议坚持用 Object.entries() 或 Object.keys()/Object.values()。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











