应用循环系统最基本方法是什么

lxf2023-03-18 10:57:02

简述

在 JavaScript 中,我们通常需要把一维数组转化成二维数组。这样的操作在数据分析和数据可视化等行业非常普遍。本文详细介绍二种将一维数组转化成二维数组的办法,希望能够帮助阅读者更好地理解这一过程。

方法一:应用循环系统

最基本方法是什么应用循环遍历一维数组,随后将每个原素插入到二维数组的相对应部位。下边是一个应用周而复始的实例编码:

function convertArray(arr, rows, columns) {
  var result = [];
  for (var i = 0; i < rows; i  ) {
    result[i] = [];
    for (var j = 0; j < columns; j  ) {
      var index = i * columns   j;
      if (index < arr.length) {
        result[i][j] = arr[index];
      }
    }
  }
  return result;
}

上边的代码中,convertArray 函数公式接受三个主要参数:初始一维数组 arr,新二维数组的个数 rows 跟新二维数组的行数 columns。函数公式最先建立一个空的二维数组 result,然后使用2个嵌套循环将每个原素插入到对应的部位。

在外部循环中,大家测算现阶段原素在一维数组里的检索 index。假如 index 低于初始数组的长度,则把初始二维数组里的相匹配原素插入到二维数组的所在位置。

应用循环系统的好处在于编码简易,便于了解。可是,此方法很有可能不足高效率,尤其是对于很大的二维数组。

方法二:应用高阶函数

另一种将一维数组转化成二维数组的办法是应用 JavaScript 二维数组的高阶函数。下边是一个应用 reduceslice 方式的实例编码:

function convertArray(arr, rows, columns) {
  return arr.reduce(function(result, item, index) {
    var rowIndex = Math.floor(index / columns);
    var colIndex = index % columns;
    if (!result[rowIndex]) {
      result[rowIndex] = [];
    }
    result[rowIndex][colIndex] = item;
    return result;
  }, []);
}

上边的代码中,我们使用 reduce 方式赋值初始二维数组 arr,随后将每个原素插入到一个新的二维数组中。在每一次迭代更新中,大家测算现阶段原素在二维数组里的队伍部位 rowIndexcolIndex,然后使用 if 句子查验二维数组中是不是已经存有这一行。假如不存有,则建立一个新的行,再将现阶段原素插入到相对应的部位。

应用高阶函数的好处在于编码更为简约,且针对大中型二维数组能够提高工作效率。与此同时,它还能够让我们应用更高级的函数公式,如 mapflatMap 等,能够更加简单化编码,提升易读性和可扩展性。下边是一个应用 flatMap 方式的实例编码:

function convertArray(arr, rows, columns) {
  return arr.flatMap((item, index) =>
    index % columns ? [] : [arr.slice(index, index   columns)]
  );
}

上边的代码中,我们使用 flatMap 方式赋值初始二维数组 arr,随后对于每一个原素 item,分辨他在新二维数组中的地位。假如是新的一行,则使用 slice 方式将这家银行的元素提取出去,随后回到这家银行。不然,回到一个空数组。

实例

力扣题解 第13期:2022. 将一维数组转化成二维数组

var construct2DArray(original, m, n) {
  const len = original.length;
  if (len !== m * n) {
    return [];
  }
  const res = new Array(m);
  for (let i = 0; i < m; i  ) {
    res[i] = original.slice(i * n, (i   1) * n);
  }
  return res;
}

该函数公式接受一个一维数组 original,或两个整数金额 mn。它首先检查 original 长度是不是相当于 m * n,假如不相当于则回到一个空的二维数组。假如长短相当于 m * n,则创建一个二维数组 res,然后使用 for 循环系统将 original 中每 n 个原素分成一行,最终回到建立好一点的二维数组 res

此方法的算法复杂度为 O(mn)O(mn),空间复杂度为 O(m)O(m)

var construct2DArray = function (original, m, n) {
    return original.length !== m * n ? [] : new Array(m).fill(0).map((v, i) => {
        return original.slice(n * i, n * i   n);
    });
};

用这种方法用了条件运算符(ternary operator)和二维数组的 map() 方式来完成建立二维数组。从总体上,它首先检查 original 长度是不是相当于 m * n,假如不相当于则回到一个空的二维数组 []。假如长短相当于 m * n,则使用 map() 方式创建一个长度为 m 的二维数组,各个因素都通过一个函数映射成一个长度为 n 的二维数组,新二维数组元素从 original 中提取出。

这一函数的第二个主要参数 i 意味着 map() 方式内部结构现阶段处理元素字符,它用于测算现阶段行开始字符,即 n * i。然后使用 slice() 方式从 original 中截取下相对应的原素。从总体上,针对第 i 行,它原素从 n * i 逐渐,到 n * i n - 1 完毕。因而,可以用 slice(n * i, n * i n) 来提取这一行的原素。

此方法用了二维数组的高阶函数 map() 方式,代码简洁最易读,可扩展性不错。算法复杂度为 O(mn)O(mn),空间复杂度为 O(m)O(m)

var construct2DArray = function(original, m, n) {
    return original.length === m * n ? 
        Array.from({ length: m }, (_, i) => original.slice(i * n, (i   1) * n)) : 
        [];
};

用这种方法用了 Array.from() 方法与箭头函数,使编码更为简约。从总体上,它首先检查 original 长度是不是相当于 m * n,假如不相当于则回到一个空的二维数组 []。假如长短相当于 m * n,则使用 Array.from() 方式创建一个长度为 m 的二维数组,并通过箭头函数将每个原素投射成一个长度为 n 的二维数组,这个新二维数组元素从 original 中提取出。最终回到这个新的二维数组。

此方法的算法复杂度为 O(mn)O(mn),空间复杂度为 O(m)O(m)

汇总

在本文中,大家阐述了二种将一维数组转化成二维数组的办法。第一种方式应用循环系统,第二种方式应用 JavaScript 的高阶函数。应用周而复始的编码非常简单,但可能不足高效率;应用高阶函数的代码更为简约,易读性和可扩展性更强,针对大中型二维数组也有一定的性能优势。

如果你需要将一维数组转化成二维数组,可以根据实际情况选择适合自己的方式。期待文中可以帮助你更好地理解 JavaScript 中二维数组的处理方法和变换方法。