编写返回数组所有组合的递归函数时报读取undefined属性的类型错误,求原因
错误原因及修复方案
报错根本原因
你遇到的类型错误是递归调用参数传递错误导致的:
- 你定义的
recurse函数要求传入两个参数prefix和arr,但你在递归调用时只传了第一个参数,第二个待处理数组参数缺省会被识别为undefined,下层递归执行arr.length时自然就抛出了「Cannot read properties of undefined (reading 'length')」的报错。 - 同时你把本该作为第二个参数传递的剩余切片数组
arr.slice(i+1)直接拼接进了prefix,也会导致前缀数组结构不符合预期。
修正后代码
function getAllCombos(arr) { let results = []; function recurse(prefix, remainingArr) { for (let i = 0; i < remainingArr.length; i++) { const newPrefix = [...prefix, remainingArr[i]]; results.push(newPrefix); // 正确传递两个参数:新前缀、当前索引后的剩余数组 recurse(newPrefix, remainingArr.slice(i + 1)); } } recurse([], arr); // 补充空数组,匹配测试用例预期输出 results.push([]); // 若需要和你给出的输出顺序完全一致,可打开下面的排序代码 // results.sort((a, b) => b.length - a.length || a.join().localeCompare(b.join())); return results; }
验证结果
运行你给出的测试用例:
console.log(getAllCombos(['a', 'b'])); // 开启排序后输出完全匹配预期:[['a','b'], ['a'], ['b'], []] console.log(getAllCombos(['a', 'b', 'c'])); // 输出包含所有预期的8种组合
内容的提问来源于stack exchange,提问作者DaShaman
相关产品推荐
相关产品推荐

