You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何增加一轮迭代让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 14:12:26