如何增加一轮迭代让JS函数生成双倍数量的目标语句?
问题描述
现有JavaScript函数仅生成了15条语句,但预期需要生成30条,例如:Training für das Polizei、Training für die Polizisten、Training für die Militär等。
当前输出结果
Training für die Polizei Training für das Polizisten Training für das Militär Training für das Sanität Training für das Sanitäter Trainings für die Polizei Trainings für das Polizisten Trainings für das Militär Trainings für das Sanität Trainings für das Sanitäter Trainingseinheit für die Polizei Trainingseinheit für das Polizisten Trainingseinheit für das Militär Trainingseinheit für das Sanität Trainingseinheit für das Sanitäter
当前代码
let ar = [ ['Training', 'für', 'die', 'Polizei'], ['Trainings', '', 'das', 'Polizisten'], ['Trainingseinheit', '', '', 'Militär'], ['', '', '', 'Sanität'], ['', '', '', 'Sanitäter'] ]; let result = []; ar.forEach((el, index) => { let sentence = [el[0]]; ar.forEach(el1 => { for(let i = 1; i < el1.length; i++) { if(el1[i]) { sentence[i] = el1[i] } } result.push(sentence.join(' ')) }) }); console.log(result);
请问如何添加一轮迭代,让该函数根据数组元素生成多一倍的语句?
解决方案
原代码的问题在于:sentence是引用类型,内层循环会覆盖之前的内容,且未实现开头、冠词、职业的全组合。要生成30条语句,核心是让3种开头、2种冠词、5种职业做全排列,最终得到3×2×5=30条组合。
方案一:拆分数组结构实现全组合
let ar = [ ['Training', 'für'], ['Trainings', 'für'], ['Trainingseinheit', 'für'], ['die', 'Polizei'], ['die', 'Militär'], ['die', 'Sanität'], ['die', 'Sanitäter'], ['das', 'Polizisten'], ['das', 'Militär'], ['das', 'Sanität'], ['das', 'Sanitäter'] ]; let result = []; // 分离开头部分和冠词+职业部分 const starters = ar.slice(0, 3); const suffixes = ar.slice(3); // 全组合:每个开头搭配每个后缀 starters.forEach(star => { suffixes.forEach(suf => { result.push([...star, ...suf].join(' ')); }); }); console.log(result);
方案二:基于原数组提取元素做全组合
如果不想修改原数组结构,可直接提取开头、冠词、职业三个独立集合,通过三重循环生成所有组合:
let ar = [ ['Training', 'für', 'die', 'Polizei'], ['Trainings', '', 'das', 'Polizisten'], ['Trainingseinheit', '', '', 'Militär'], ['', '', '', 'Sanität'], ['', '', '', 'Sanitäter'] ]; let result = []; // 提取所有有效开头、冠词、职业 const starters = ar.map(item => item[0]).filter(Boolean); const articles = [...new Set(ar.map(item => item[2]).filter(Boolean))]; const jobs = ar.map(item => item[3]).filter(Boolean); // 三重循环生成全组合 starters.forEach(start => { articles.forEach(art => { jobs.forEach(job => { result.push(`${start} für ${art} ${job}`); }); }); }); console.log(result);
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

