如何编写getValidPassword函数筛选二维数组中的全偶数子数组
编程问题:筛选全偶数元素的密码数组
需求说明
编写名为getValidPassword的函数,接收二维数组为参数,每个子数组代表一个密码,需找出所有数字均为偶数的密码并返回。
示例
var loggedPasscodes =[ [1, 4, 4, 1], [1, 2, 3, 1], [2, 6, 0, 8], [5, 5, 5, 5], [4, 3, 4, 3, 8], [4, 3, 2, 3, 9] ]; getValidPassword(loggedPasscodes) // 返回数组: [2, 6, 0, 8]
尝试的代码及问题
var loggedPasscodes = [ [1, 4, 4, 2], [1, 2, 3, 1], [2, 2, 2, 1], [5, 5, 5, 5], [4, 3, 4, 3], [4, 1, 4, 8], [2, 6, 0, 8], [6, 2, 8, 1] ]; var getValidPassword = function (arr){ for(var i = 0; i < loggedPasscodes.length; i++){ var loggedPasscodesItem = loggedPasscodes[i].join(''); console.log('loggedPasscodes items ' + i + ' :' + loggedPasscodesItem); console.log('typeof loggedPasscodesItem: ' + typeof loggedPasscodesItem ); for(var j = 0; j < loggedPasscodes[i].length; j++){ console.log('loggedPasscodes ' + [i] + ':' + loggedPasscodes[i][j]); if(loggedPasscodes[i] >= '0') && (loggedPasscodes[i][j] % 2 === 0)) { var eachPasscodeString = loggedPasscodes[i]; var eachArray = Array.from(eachPasscodeString, Number); console.log('eachArray ' + i + ': ' + eachArray); } else if ((loggedPasscodes[i) >= '1') && (loggedPasscodes[i][j] % 2 ===0)){ console.log('eachArray ' + i + ': ' + eachArray); } } } }; getValidPassword(loggedPasscodes);
遇到的问题:
- 出现
eachArray作用域警告 - 逻辑混乱,无法正确筛选出全偶数的子数组
- 代码存在语法错误(括号不匹配)
问题分析与解决方案
代码错误点梳理
- 未使用函数参数:函数接收的
arr参数未被使用,反而依赖全局变量loggedPasscodes,导致函数无法复用。 - 语法错误:
if条件中括号不匹配,且loggedPasscodes[i] >= '0'是将数组与字符串比较,逻辑完全错误。 - 作用域问题:
eachArray在if块内声明,却在else if块中引用,会导致变量未定义的报错。 - 逻辑偏差:仅检查单个元素是否为偶数,未判断整个子数组的所有元素是否都满足条件。
正确实现思路
- 遍历输入二维数组中的每一个子数组。
- 对每个子数组,验证所有元素是否都是偶数。
- 收集所有符合条件的子数组,最终返回这个结果集合。
实现代码
简洁写法(利用数组方法)
function getValidPassword(arr) { // filter筛选符合条件的子数组,every检查子数组所有元素是否为偶数 return arr.filter(passcode => passcode.every(num => num % 2 === 0)); }
基础for循环写法(适合新手理解)
function getValidPassword(arr) { const validPasswords = []; // 遍历每个子数组 for (let i = 0; i < arr.length; i++) { const currentPasscode = arr[i]; let isAllEven = true; // 检查当前子数组的每个元素 for (let j = 0; j < currentPasscode.length; j++) { const num = currentPasscode[j]; // 如果有一个元素不是偶数,标记为无效并跳出循环 if (num % 2 !== 0) { isAllEven = false; break; } } // 如果全是偶数,加入结果数组 if (isAllEven) { validPasswords.push(currentPasscode); } } return validPasswords; }
代码说明
- 简洁写法:
Array.filter()用于筛选出满足条件的子数组,Array.every()用于验证子数组中的所有元素是否都符合“是偶数”的条件,两者结合一行代码即可完成需求。 - 基础写法:通过嵌套for循环手动遍历,用
isAllEven标记当前子数组是否全为偶数,避免逻辑混乱,更适合新手理解变量作用域和循环逻辑。
内容的提问来源于stack exchange,提问作者JRPCRD
相关产品推荐
相关产品推荐

