JS嵌套数组解构实现会员分类 如何正确返回全部判定结果
问题背景
Western Suburbs Croquet Club设有两类会员资格:Senior(资深会员)、Open(公开会员),需开发申请表单判定程序,告知申请用户所属会员类别。
资深会员判定规则:年龄不低于55岁,且handicap(差点)大于7。该俱乐部差点取值范围为-2到+26,选手水平越高,差点数值越低。
现存疑问
当前编写的openOrSenior函数仅返回单个值,咨询如何对嵌套数组进行解构处理,该场景下应当使用递归实现还是forEach方法,才能让所有分类结果正确输出到结果数组中。
现有实现代码如下:
function openOrSenior(data) { let str = []; for (let i = 0; i < data.length; i++) { if (data == '') { return 'error!'; } else if (data[0] >= 55 && data[1] > 7) { str.push('Senior'); } else { str.push('Open'); } return str; } } console.log(openOrSenior([ [18, 20], [45, 2], [61, 12], [37, 6], [21, 21], [78, 9] ]));
问题排查
现有代码的核心问题有3个:
- 取值逻辑错误:循环过程中没有取当前遍历到的子项
data[i],直接访问外层数组的data[0]、data[1],永远只能读取第一组申请人的信息 - 返回时机错误:
return str写在for循环内部,第一次循环执行完就会直接终止函数,后续所有申请人数据都不会被处理 - 空值判断无效:
data == ''无法正确识别空数组、非数组类的非法入参,正常传入二维数组时该判断永远不会触发
实现方案选择
这个场景不需要使用递归:递归适合处理层级深度不确定的嵌套结构,当前入参是固定结构的二维数组(第一层为申请人列表,第二层为单个人的年龄、差点两个固定字段),用数组遍历方法实现逻辑更简单、可读性更高。
可以直接用数组解构+forEach实现,也可以用更适合映射转换场景的map方法实现:
forEach 实现版本
function openOrSenior(data) { // 入参合法性校验 if (!Array.isArray(data) || data.length === 0) return 'error!'; const result = []; // 遍历时直接解构每个子数组的年龄、差点字段 data.forEach(([age, handicap]) => { result.push(age >= 55 && handicap > 7 ? 'Senior' : 'Open'); }) return result; }
map 简洁实现版本
map会遍历每个元素并返回由处理结果组成的新数组,不需要手动维护结果数组做push操作,代码更精简:
function openOrSenior(data) { if (!Array.isArray(data) || data.length === 0) return 'error!'; return data.map(([age, handicap]) => age >= 55 && handicap > 7 ? 'Senior' : 'Open'); }
传入题目给出的测试用例执行后,会返回正确结果:['Open', 'Open', 'Senior', 'Open', 'Open', 'Senior']
内容的提问来源于stack exchange,提问作者shiroSn
相关产品推荐
相关产品推荐

