从1维数组创建2维数组

9 浏览
0 Comments

从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]]

0
0 Comments

问题的出现原因:在给定一个一维数组的情况下,需要将其转换为二维数组。原始代码中使用了迭代的方式来实现,但有更简洁的方法可以完成相同的任务。

解决方法:可以使用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函数的实现。

0
0 Comments

从上面的代码中,我们可以看到函数`twoDArray`接受两个参数,一个是一维数组`array`,另一个是指定每个子数组的长度`length`。该函数的目的是将一维数组转换成二维数组,其中每个子数组的长度为`length`。

函数内部使用了`Array#reduce`方法来实现转换过程。`Array#reduce`方法是数组的一个方法,它接受一个回调函数和一个初始值作为参数。回调函数接受四个参数:累加器`r`、当前元素`a`、当前索引`i`和原始数组`array`。回调函数的返回值将被作为下一次迭代的累加器值。

在回调函数内部,通过判断当前索引`i`是否为`length`的倍数,来决定是将当前元素`a`添加到已有的子数组中,还是创建一个新的子数组并将当前元素`a`添加到其中。最后,回调函数返回更新后的累加器`r`。

最后,函数`twoDArray`返回转换后的二维数组。

以上就是该问题出现的原因以及解决方法的整理。通过使用`Array#reduce`方法,我们可以方便地将一维数组转换成二维数组,并且可以指定每个子数组的长度。这样的转换在处理特定的数据结构或算法时非常有用。

0
0 Comments

创建一个二维数组,从一维数组中创建的问题,出现的原因是因为原始方法太过复杂。解决方法是使用slice()函数来处理数组的末尾。以下是解决方法的代码:

function twoDArray(arr, lenSubArray) {
  var i = 0, result = [];
  while(i < arr.length)
    result.push( arr.slice(i, i+=lenSubArray) );
  return result;  
}

非常感谢,我之前不知道slice()函数可以处理数组的末尾。

0