JavaScript:如何将固定层级flatMap排列函数改造成递归动态版本
实现任意长度排列组合的递归flatMap版函数
核心思路
把多层flatMap的嵌套逻辑转化为递归调用:每次处理一组选项,将当前已拼接的前缀与当前组的每个选项拼接,直到所有选项组都处理完成时返回最终拼接结果。
实现代码
function getPermutations(optionsList) { // 递归处理函数:参数为当前处理到的选项组索引、当前已拼接的前缀 const recursiveFlatMap = (index, prefix) => { const currentOptions = optionsList[index].options; // 已经处理到最后一组选项,直接返回前缀和当前选项的拼接结果 if (index === optionsList.length - 1) { return currentOptions.map(item => `${prefix} ${item}`.trim()); } // 不是最后一组,继续递归flatMap下一组 return currentOptions.flatMap(item => { const newPrefix = prefix ? `${prefix} ${item}` : item; return recursiveFlatMap(index + 1, newPrefix); }); }; // 边界判断:输入为空直接返回空数组 if (!optionsList || optionsList.length === 0) return []; // 从第0组、空前缀开始递归 return recursiveFlatMap(0, ''); }
测试验证
// 原3组选项的测试用例 const testOptions = [{ "options": ['blue', 'gray', 'green'] }, { "options": ['large', 'medium', 'small'] }, { "options": ['wood', 'steel', 'plastic'] }]; console.log('3组选项的排列结果', getPermutations(testOptions)); // 新增测试:2组选项的情况 const testOptions2 = [{ options: ['男','女'] }, { options: ['18岁以下','18-30岁','30岁以上'] }]; console.log('2组选项的排列结果', getPermutations(testOptions2)); // 新增测试:4组选项的情况 const testOptions3 = [...testOptions, {options: ['圆形','方形','异形']}]; console.log('4组选项的排列结果', getPermutations(testOptions3));
特性说明
- 支持传入任意长度(≥1)的选项组数组,自动适配嵌套层级
- 输出格式和原函数完全一致,为空格分隔的排列字符串数组
- 做了空输入的边界处理,避免运行报错
内容的提问来源于stack exchange,提问作者Nouvello Studio
相关产品推荐
相关产品推荐

