如何用单索引值遍历二维嵌套数组并比较各子数组同位置元素
原代码错误点
- 内层循环条件写错:将循环终止条件
j < remainderWords.length误写为i < remainderWords.length,会引发死循环、下标越界问题 - 变量名拼写错误:定义的剩余子数组变量名为
remainderWords,判断时错写为remaindersWord - 缺少状态记录:仅做了单次元素相等判断,没有记录当前列所有元素是否全部匹配的状态,也没有在出现不匹配时及时终止循环
- 语法不完整:
if判断语句缺少包裹条件的圆括号、执行逻辑块的花括号
实现逻辑
按列遍历二维数组即可,步骤如下:
- 取出第一个子数组作为比对基准,其余子数组为待比对集合
- 遍历基准子数组的每个索引位置
i(即遍历二维数组的每一列) - 对每个列索引
i,先默认标记「当前列所有元素相等」 - 依次遍历剩余所有子数组,取子数组
i位置的元素和基准值比对:- 若出现元素不相等、或子数组长度不足不存在
i位置的情况,将标记改为不相等,直接终止当前列的后续比对 - 若所有子数组比对完成标记仍为相等,说明当前列满足全部元素相等的要求
- 若出现元素不相等、或子数组长度不足不存在
代码实现
兼容原写法的循环版本
和最初的嵌套循环思路一致,修正错误后可直接运行:
// 原示例中a/b/c等未定义,这里补为字符串做测试,实际使用替换为业务数据即可 const array = [['a','b','c'],['e','f','g'],['h','i','j']]; const firstWord = array[0]; const remainderWords = array.slice(1); for(let i = 0; i < firstWord.length; i++){ let isAllEqual = true; // 修正循环条件为j < 数组长度 for (let j = 0; j < remainderWords.length; j++){ // 增加长度判断避免下标越界,修正变量名拼写 if (i >= remainderWords[j].length || firstWord[i] !== remainderWords[j][i]) { isAllEqual = false; break; // 出现不匹配直接跳出内层循环,减少无效遍历 } } // 此处isAllEqual就是array[0][i] == array[1][i] == array[2][i]的判断结果 console.log(`索引${i}列全相等:`, isAllEqual); if (isAllEqual) { // 写全相等时需要执行的业务逻辑 } }
简洁API版本
用数组内置every方法可以简化代码,逻辑和循环版本完全一致:
const array = [['a','b','c'],['e','f','g'],['h','i','j']]; const [firstWord, ...remainderWords] = array; firstWord.forEach((baseVal, i) => { const isAllEqual = remainderWords.every(word => i < word.length && word[i] === baseVal); console.log(`索引${i}列全相等:`, isAllEqual); })
注意:如果二维数组中存在子数组长度不一致的情况,必须增加长度判断,否则短数组取高位索引时会返回
undefined,导致判断结果不符合预期。
内容的提问来源于stack exchange,提问作者the12
相关产品推荐
相关产品推荐

