如何在javascript(或jquery)中将简单数组转换为二维数组(矩阵)

Bak*_*yor 33 javascript arrays jquery multidimensional-array

想象一下,我有一个阵列

A = Array(1, 2, 3, 4, 5, 6, 7, 8, 9);
Run Code Online (Sandbox Code Playgroud)

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

A = Array(Array(1, 2, 3), Array(4, 5, 6), Array(7, 8, 9));
Run Code Online (Sandbox Code Playgroud)

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

jwu*_*ler 48

像这样的东西?

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;
}
Run Code Online (Sandbox Code Playgroud)

用法:

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


sam*_*ime 29

您可以使用该Array.prototype.reduce功能在一行中执行此操作.

ECMAScript 6风格:

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

"普通"JavaScript:

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

您可以将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, []);
Run Code Online (Sandbox Code Playgroud)

"普通"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;
  }, []);
}
Run Code Online (Sandbox Code Playgroud)

  • 在 `reduce()` 函数中,回调的第一个参数是您将要返回的值。改变它没有什么坏处,因为它是为此而创建的(用 `reduce()` 的第二个参数初始化)。不需要避免在其上进行突变的额外开销(实际上,突变可能更高效)。它仍然符合“函数式”编程的要求。 (2认同)

小智 7

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

  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;
    }
Run Code Online (Sandbox Code Playgroud)
  1. 定义空数组。
  2. 根据大小进行迭代,因此我们将获得指定的块。这就是为什么我用size递增i,因为size可以是2,3,4,5,6 ......
  3. 在这里,首先我将i切片为(i + size),然后将其推入空数组res
  4. 返回二维数组。


Cal*_*röm 6

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

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

用法会是这样的

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

const result = arrayToMatrix(things, 2)
Run Code Online (Sandbox Code Playgroud)

结果最终是

[
  ['item 1', 'item 2'],
  ['item 1', 'item 2'],
  ['item 1', 'item 2']
]
Run Code Online (Sandbox Code Playgroud)