JavaScript如何从多维数组提取对角线生成指定嵌套数组
问题说明
给定如下3*3二维矩阵:
const arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]
预期提取矩阵两条对角线元素,输出结构为[[1,5,9],[3,5,7]]的嵌套数组。原有实现代码运行后仅能得到值正确但顺序混乱的一维数组,无法满足要求。
错误原因
原有代码的问题点如下:
- 初始化的结果数组是一维结构,没有预先创建分别存储主对角线、副对角线元素的两个子数组,所有匹配元素直接插入根数组,无法生成嵌套结构
- 双重循环遍历所有矩阵单元格的逻辑冗余,副对角线索引递减的逻辑嵌套在内层循环中,打乱了元素的插入顺序,也没有对两条对角线的元素做分组存储
修正代码
矩阵对角线取值不需要遍历所有单元格,单次遍历行索引即可完成取值:主对角线元素的横纵坐标永远相等,即arr[i][i];副对角线元素的纵坐标为「矩阵长度-1-当前行索引」,即arr[i][arr.length - 1 -i]。直接将匹配到的元素存入对应子数组即可。
const arr = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] // 初始化结果数组,内置两个子数组分别存储两条对角线的元素 const new_arr = [[], []] const matrixLength = arr.length for (let i = 0; i < matrixLength; i++) { // 主对角线元素存入第一个子数组 new_arr[0].push(arr[i][i]) // 副对角线元素存入第二个子数组 new_arr[1].push(arr[i][matrixLength - 1 - i]) } console.log(new_arr) // 输出 [[1,5,9],[3,5,7]]
拓展提示:如果使用场景中要求奇数阶矩阵的中心元素不重复存储,可以在插入副对角线元素前增加判断:当
i !== matrixLength - 1 -i时再执行push操作即可,当前示例需求保留重复的中心元素,无需额外判断。
内容的提问来源于stack exchange,提问作者Butterman
相关产品推荐
相关产品推荐

