javascript中用reduce实现多维数组深度展平的核心是:递归判断元素是否为数组,是则继续展开并concat进累积器,否则直接concat;初始值必须为[]。

JavaScript 中用 reduce 配合数组 API 实现多维数组的深度展平,核心在于:递归判断每个元素是否为数组,是则继续展开,否则保留原值;再用 reduce 累积所有子项。
reduce + Array.isArray + 递归调用
这是最经典、可读性高且兼容性好的方式。关键点是把当前层级的每个元素做判断:
- 如果元素是数组,就递归调用展平函数,再把结果逐个
concat或展开(...)进累积器 - 如果不是数组,直接
push或拼接到结果中 -
reduce的初始值必须是空数组[],确保类型统一
示例代码:
const flatten = arr =>
arr.reduce((acc, item) =>
Array.isArray(item)
? acc.concat(flatten(item))
: acc.concat(item),
[]
);
注意:concat 不修改原数组,返回新数组,适合函数式风格;若追求性能,也可用 push(...flatten(item)) 替代 concat,但需确保 acc 是数组引用(此时初始值仍为 [],没问题)。
用扩展运算符替代 concat 提升可读性
ES6+ 环境下,用 [...acc, ...flatten(item)] 更直观,但要注意它每次都会创建新数组,深层嵌套时内存开销略大:
const flatten = arr =>
arr.reduce((acc, item) =>
Array.isArray(item)
? [...acc, ...flatten(item)]
: [...acc, item],
[]
);
这种写法语义清晰,适合教学或中小型数据;生产环境若处理超大嵌套数组,建议用 push + 原地累积优化:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const flatten = arr => {
const result = [];
arr.forEach(item => {
if (Array.isArray(item)) {
result.push(...flatten(item));
} else {
result.push(item);
}
});
return result;
};
虽然没用 reduce,但它本质逻辑一致,且更易调试和控制流程。
不依赖递归:用栈模拟实现迭代式深度展平
避免潜在的栈溢出(极深嵌套),可用 while + 数组模拟栈:
const flatten = arr => {
const stack = [...arr];
const result = [];
while (stack.length > 0) {
const next = stack.pop();
if (Array.isArray(next)) {
stack.push(...next); // 拆开后倒序压入(保证原顺序)
} else {
result.push(next);
}
}
return result.reverse(); // 因为 pop 是后进先出,需反转
};
这个版本完全规避递归,适合不确定嵌套深度的场景;reduce 在这里不适用,但它是对“递归 reduce”思路的有效补充。
一行式(带限制):flat() 是更现代的替代方案
如果目标环境支持 ES2019+,直接用 arr.flat(Infinity) 最简洁:
const flattened = [1, [2, [3, [4]]]].flat(Infinity); // [1, 2, 3, 4]
它底层也做了类似递归展开的处理,但无需手写逻辑;不过 flat 不能自定义展平逻辑(比如跳过 null、过滤对象等),灵活性不如 reduce 方案。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










