将简单数组转换为二维数组(矩阵)

IT技术 javascript jquery arrays multidimensional-array
2021-02-06 15:40:51

想象一下我有一个数组:

A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9);

我希望它转换成二维数组(N x M 的矩阵),例如这样:

A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9));

请注意,矩阵的行和列是可变的。

6个回答

像这样的东西?

function listToMatrix(list, elementsPerSubArray) {
    var matrix = [], i, k;

    for (i = 0, k = -1; i < list.length; i++) {
        if (i % elementsPerSubArray === 0) {
            k++;
            matrix[k] = [];
        }

        matrix[k].push(list[i]);
    }

    return matrix;
}

用法:

var matrix = listToMatrix([1, 2, 3, 4, 4, 5, 6, 7, 8, 9], 3);
// result: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

您可以使用该Array.prototype.reduce函数在一行中完成此操作。

ECMAScript 6 风格:

myArr.reduce((rows, key, index) => (index % 3 == 0 ? rows.push([key]) 
  : rows[rows.length-1].push(key)) && rows, []);

“普通”JavaScript:

myArr.reduce(function (rows, key, index) { 
  return (index % 3 == 0 ? rows.push([key]) 
    : rows[rows.length-1].push(key)) && rows;
}, []);

您可以将 3 更改为您想要的列数,或者更好的是,将其放入可重用的函数中:

ECMAScript 6 风格:

const toMatrix = (arr, width) => 
    arr.reduce((rows, key, index) => (index % width == 0 ? rows.push([key]) 
      : rows[rows.length-1].push(key)) && rows, []);

“普通”JavaScript:

function toMatrix(arr, width) {
  return arr.reduce(function (rows, key, index) { 
    return (index % width == 0 ? rows.push([key]) 
      : rows[rows.length-1].push(key)) && rows;
  }, []);
}
避免改变“行”数组不是一个好主意吗?const toMatrix = (arr, width) => arr.reduce((rows, key, index) => (index % width === 0) ? [...rows, [key]] : [...rows. slice(0,-1), [...rows[rows.length -1], key]], []);
2021-03-16 15:40:51
reduce()函数中,回调的第一个参数是您将要返回的值。改变它没有坏处,因为它是为此而创建的(用 的第二个参数初始化reduce())。不需要避免在其上进行突变的额外开销(实际上,突变可能更高效)。它仍然符合“函数式”编程的要求。
2021-04-12 15:40:51

此代码是通用的,无需担心大小和数组,通用

  function TwoDimensional(arr, size) 
    {
      var res = []; 
      for(var i=0;i < arr.length;i = i+size)
      res.push(arr.slice(i,i+size));
      return res;
    }
  1. 定义空数组。
  2. 根据大小迭代,所以我们会得到指定的块。这就是为什么我size递增i,因为大小可以是 2,3,4,5,6......
  3. 在这里,首先我从i切片(i+size)然后我将它推送到空数组res
  4. 返回二维数组。

怎么样:

var matrixify = function(arr, rows, cols) {
    var matrix = [];
    if (rows * cols === arr.length) {
        for(var i = 0; i < arr.length; i+= cols) {
            matrix.push(arr.slice(i, cols + i));
        }
    }

    return matrix;
};

var a = [0, 1, 2, 3, 4, 5, 6, 7];
matrixify(a, 2, 4);

http://jsfiddle.net/andrewwhitaker/ERAUs/

当我自己偶然发现这个时,我能想出的最干净的方法如下:

const arrayToMatrix = (array, columns) => Array(Math.ceil(array.length / columns)).fill('').reduce((acc, cur, index) => {
  return [...acc, [...array].splice(index * columns, columns)]
}, [])

使用情况类似于

const things = [
  'item 1', 'item 2',
  'item 1', 'item 2',
  'item 1', 'item 2'
]

const result = arrayToMatrix(things, 2)

结果最终是

[
  ['item 1', 'item 2'],
  ['item 1', 'item 2'],
  ['item 1', 'item 2']
]
所以cur根本不使用?
2021-03-20 15:40:51