如何消除嵌套数组以生成规整二维数组?代码问题求助
修正JavaScript函数以生成预期的二维数组
你的当前函数会把所有数组元素直接展开,导致普通一维数组(如[1,2,3,4])被拆分为单个元素,无法得到目标的规整二维数组。以下是修改后的实现:
修改后的代码(flatMap版本)
function convertArr () { const separateNestedArrays = function (arr) { return arr.flatMap((element) => { if (Array.isArray(element)) { // 检查当前数组是否包含嵌套子数组 const hasNestedArray = element.some(item => Array.isArray(item)); // 有嵌套则展开,无嵌套则保留原数组作为单个元素 return hasNestedArray ? element : [element]; } else { // 兼容非数组元素,包装为一维数组 return [[element]]; } }); }; const twoDimensionalArray = [ [1, 2, 3, 4], [[5, 6], [9, 10]], [5, 6, 7] ]; const modifiedArray = separateNestedArrays(twoDimensionalArray); console.log(modifiedArray); // 输出:[[1, 2, 3, 4], [5, 6], [9, 10], [5, 6, 7]] };
逻辑说明
- 利用
flatMap的特性:返回的数组会被自动展开一层; - 对每个元素做判断:
- 如果是数组,用
some检测是否包含嵌套的子数组:- 若包含(如
[[5,6],[9,10]]),直接返回该数组,flatMap会将其拆分为多个子数组元素; - 若不包含(如
[1,2,3,4]),返回包裹原数组的新数组,flatMap会将整个数组作为单个元素保留;
- 若包含(如
- 若元素不是数组,将其包装为一维数组后返回(兼容原输入外的边界情况)。
- 如果是数组,用
备选实现(reduce版本)
如果更习惯用reduce处理数组,也可以用以下方式:
const separateNestedArrays = function (arr) { return arr.reduce((result, element) => { if (Array.isArray(element)) { if (element.some(item => Array.isArray(item))) { // 展开嵌套数组,将子数组逐一推入结果 result.push(...element); } else { // 直接推入原一维数组 result.push(element); } } else { result.push([element]); } return result; }, []); };
内容的提问来源于stack exchange,提问作者Borgher
相关产品推荐
相关产品推荐

