通用数据转数组工具函数的核心是按类型合理转换:null/undefined→[];字符串→字符数组或分割;原始值→单元素数组;类数组/可迭代对象→Array.from;普通对象→默认Object.values,支持keys/entries选项。

通用的数据转数组工具函数,核心是能处理多种常见输入类型(如 null、undefined、字符串、类数组、普通对象、Set、Map、迭代器等),并统一返回标准数组。关键不在“全能”,而在“合理”——对每种输入有明确、符合直觉的转换逻辑。
基础判断与兜底处理
先排除空值和非对象/非原始值的异常情况,再按类型分流:
-
null 和 undefined → 返回空数组
[] - 已经是 Array → 直接返回(可选是否深拷贝,通常浅拷贝即可)
- 是 String → 按字符拆成数组(
"abc"→["a","b","c"]),或按需支持按分隔符分割(如传入sep参数) - 是 Number、Boolean、Symbol 等原始值 → 包裹成单元素数组(
42→[42])
识别并展开类数组与可迭代结构
利用 JavaScript 内置能力判断可迭代性,避免手动遍历 arguments 或 NodeList:
- 检查
[Symbol.iterator]是否存在且为函数 → 调用Array.from()转换(兼容 Set、Map、自定义迭代器) - 检查是否有
length属性且为非负整数 → 视为类数组,也用Array.from()(自动处理HTMLCollection、arguments) - 对 Map,默认取
Array.from(map.values());若需键值对,可加mode: 'entries'选项
对象的转换策略要明确
普通对象没有固有顺序,不能直接 Array.from(obj)。需约定行为:
- 默认行为:取
Object.values(obj)(最常用) - 提供选项如
keys: true→ 返回Object.keys(obj) - 提供选项如
entries: true→ 返回Object.entries(obj) - 避免默认展开嵌套对象,保持扁平——这是“通用工具”的边界,深度处理应交给专门函数
简洁实现示例(无依赖)
以下是一个兼顾可读性与覆盖度的参考实现:
function toArray(input, options = {}) {
const { sep, keys = false, entries = false } = options;
if (input == null) return [];
if (Array.isArray(input)) return input;
if (typeof input === 'string') {
return sep !== undefined ? input.split(sep) : [...input];
}
if (typeof input === 'object') {
if (input[Symbol.iterator] && typeof input[Symbol.iterator] === 'function') {
return Array.from(input);
}
if (input.length != null && Number.isInteger(input.length) && input.length >= 0) {
return Array.from(input);
}
// 普通对象
if (keys) return Object.keys(input);
if (entries) return Object.entries(input);
return Object.values(input);
}
return [input]; // 原始值
}

















