【问题标题】:Creating 2d-array from 1d array从一维数组创建二维数组
【发布时间】:2016-12-27 16:41:38
【问题描述】:

我是编程新手,我有一个任务要求从一维数组创建一个二维数组。我想出了这个(没有任何外部资源的帮助,因为它带走了学习经验)。它适用于我们的教授测试输入,我只是想知道这是一个丑陋/低效的解决方案。

function twoDArray(arr, lenSubArray) {
    var newArr = []; 
    var placeHolder = 0; 
    var leftOver = 0; 
    for (var i = 1; i < arr.length + 1; i++) {
        /* if i is a multiple of the specified sub-array size 
           then add the elements from placeHolder to i
        */
        if (i % lenSubArray === 0) {
            newArr.push(arr.slice(placeHolder, i)); 
            placeHolder += lenSubArray; 
            leftOver++; // tells us how many sub-arrays were created
        }
    }
    /* if original array is not divisible by the length of the specified sub-array
       then there will be left over values. Retrieve these values and create an 
       array out of them and add them to the 2d array.
    */
    if (!(arr.length % lenSubArray === 0)) {
         /* sub-array count multiplied by the length of each 
            sub-array gives us the right index to retrieve remaining values
        */
        leftOver = (leftOver * lenSubArray);
        newArr.push(arr.slice(leftOver))
    }

    return newArr; 
}

测试输入:twoDArray([1, 2, 3, 4, 5], 3) 输出将是:[[1, 2, 3], [4, 5]]

【问题讨论】:

标签: javascript arrays multidimensional-array


【解决方案1】:

您不需要遍历数组。您可以改用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(a.length/b),你不必通过过滤来修补结果,你可以使用(Array(len)+'').split(',').map(fn)而不是Array(len).fill(0).map(fn)或@987654327 @
  • @Thomas。使用Math.ceil 是不好的做法,最好将第二个参数转换为整数,然后过滤数组是必要的。另外,Array.prototype.fill 在某些版本的 Node.js 中没有实现。
  • 为什么你认为Math.ceil 比创建两个不必要的数组并在结果的每个元素上调用过滤函数更糟糕,甚至更糟糕?
  • @Thomas。因为Math.ceil 可以产生NaN 值,如果某些错误发生,这可能会在以后导致问题。但无论如何,我编辑了答案。
【解决方案2】:

您可以使用Array#reduce 并根据索引构建新数组。

function twoDArray(array, length) {
    return array.reduce(function (r, a, i) {
        i % length ? r[r.length - 1].push(a) : r.push([a]);
        return r;
    }, []);
}

console.log(twoDArray([1, 2, 3, 4, 5], 3));

【讨论】:

    【解决方案3】:

    你太复杂了:

    • 创建一个结果数组
    • 将切片从i 推送到i+lenSubArray
    • i 增加lenSubArray

    并且 slice 足够聪明,可以正确处理数组的末尾

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

    【讨论】:

    • 非常感谢,我不知道 slice() 可以处理数组的末尾。
    猜你喜欢
    • 1970-01-01
    • 2023-01-04
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多