简述
在 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 二维数组的高阶函数。下边是一个应用 reduce
和 slice
方式的实例编码:
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
,随后将每个原素插入到一个新的二维数组中。在每一次迭代更新中,大家测算现阶段原素在二维数组里的队伍部位 rowIndex
和 colIndex
,然后使用 if
句子查验二维数组中是不是已经存有这一行。假如不存有,则建立一个新的行,再将现阶段原素插入到相对应的部位。
应用高阶函数的好处在于编码更为简约,且针对大中型二维数组能够提高工作效率。与此同时,它还能够让我们应用更高级的函数公式,如 map
,flatMap
等,能够更加简单化编码,提升易读性和可扩展性。下边是一个应用 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
,或两个整数金额 m
和 n
。它首先检查 original
长度是不是相当于 m * n
,假如不相当于则回到一个空的二维数组。假如长短相当于 m * n
,则创建一个二维数组 res
,然后使用 for
循环系统将 original
中每 n
个原素分成一行,最终回到建立好一点的二维数组 res
。
此方法的算法复杂度为 ,空间复杂度为 。
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()
方式,代码简洁最易读,可扩展性不错。算法复杂度为 ,空间复杂度为 。
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
中提取出。最终回到这个新的二维数组。
此方法的算法复杂度为 ,空间复杂度为 。
汇总
在本文中,大家阐述了二种将一维数组转化成二维数组的办法。第一种方式应用循环系统,第二种方式应用 JavaScript 的高阶函数。应用周而复始的编码非常简单,但可能不足高效率;应用高阶函数的代码更为简约,易读性和可扩展性更强,针对大中型二维数组也有一定的性能优势。
如果你需要将一维数组转化成二维数组,可以根据实际情况选择适合自己的方式。期待文中可以帮助你更好地理解 JavaScript 中二维数组的处理方法和变换方法。