从1维数组创建2维数组
从1维数组创建2维数组
我刚开始学习编程,我有一个作业要求从一个一维数组创建一个二维数组。我想出了这个解决方案(没有从任何外部来源获取帮助,因为这会削弱学习经验)。它可以通过我们教授的测试输入,我只是想知道这是否是一个丑陋/低效的解决方案。
function twoDArray(arr, lenSubArray) { var newArr = []; var placeHolder = 0; var leftOver = 0; for (var i = 1; i < arr.length + 1; i++) { /* 如果i是指定子数组大小的倍数,则将元素从placeHolder添加到i */ if (i % lenSubArray === 0) { newArr.push(arr.slice(placeHolder, i)); placeHolder += lenSubArray; leftOver++; // 告诉我们创建了多少个子数组 } } /* 如果原始数组不能被指定子数组的长度整除,则会有剩余值。获取这些值,创建一个数组并将它们添加到二维数组中。 */ if (!(arr.length % lenSubArray === 0)) { /* 子数组数乘以每个子数组的长度给出了正确的索引,以检索剩余值 */ leftOver = (leftOver * lenSubArray); newArr.push(arr.slice(leftOver)) } return newArr; }
测试输入:twoDArray([1, 2, 3, 4, 5], 3)
输出:[[1, 2, 3], [4, 5]]
问题的出现原因:在给定一个一维数组的情况下,需要将其转换为二维数组。原始代码中使用了迭代的方式来实现,但有更简洁的方法可以完成相同的任务。
解决方法:可以使用Array.prototype.slice
函数来实现。具体代码如下:
function twoDArray(a, b){ return (Array(Math.ceil(a.length / b)) + '').split(',').map(function(c, d){ return a.slice(b * d, b * (d + 1)); }); } var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; console.log(twoDArray(a, 3)); // Output: // [ // [1, 2, 3], // [4, 5, 6], // [7, 8, 9], // [10, 11, 12] // ]
然而,以上代码中存在一些问题。首先,使用Math.ceil
函数来计算数组长度并不是最佳实践,最好将第二个参数转换为整数,然后再进行数组过滤。其次,Array.prototype.fill
函数在某些版本的Node.js中并未实现。
为了解决以上问题,可以采用以下修改后的代码:
function twoDArray(a, b){ var len = parseInt(a.length / b); return Array(len).fill(0).map(function(c, d){ return a.slice(b * d, b * (d + 1)); }); } var a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; console.log(twoDArray(a, 3)); // Output: // [ // [1, 2, 3], // [4, 5, 6], // [7, 8, 9], // [10, 11, 12] // ]
这样修改后的代码更加简洁和高效,避免了使用Math.ceil
函数可能出现的NaN
值问题,并且不依赖于Array.prototype.fill
函数的实现。
从上面的代码中,我们可以看到函数`twoDArray`接受两个参数,一个是一维数组`array`,另一个是指定每个子数组的长度`length`。该函数的目的是将一维数组转换成二维数组,其中每个子数组的长度为`length`。
函数内部使用了`Array#reduce`方法来实现转换过程。`Array#reduce`方法是数组的一个方法,它接受一个回调函数和一个初始值作为参数。回调函数接受四个参数:累加器`r`、当前元素`a`、当前索引`i`和原始数组`array`。回调函数的返回值将被作为下一次迭代的累加器值。
在回调函数内部,通过判断当前索引`i`是否为`length`的倍数,来决定是将当前元素`a`添加到已有的子数组中,还是创建一个新的子数组并将当前元素`a`添加到其中。最后,回调函数返回更新后的累加器`r`。
最后,函数`twoDArray`返回转换后的二维数组。
以上就是该问题出现的原因以及解决方法的整理。通过使用`Array#reduce`方法,我们可以方便地将一维数组转换成二维数组,并且可以指定每个子数组的长度。这样的转换在处理特定的数据结构或算法时非常有用。