如何基于数组值与自定义索引生成组合语句?
数组元素组合生成指定语句
给定数组
let ar = [ ["Training", "für", "die", "Polizei"], ["Trainings", "", "das", "Polizisten"], ["Trainingseinheit", "", "", "Militär"] ]
需求说明
需要通过数组ar中各元素的组合生成语句,预期结果如下:
预期结果
let result = [ ["Training für die Polizei"], ["Training für die Polizisten"], ["Training für die Militär"], ["Training für das Polizei"], ["Training für das Polizisten"], ["Training für das Militär"], ["Trainings für die Polizei"], ["Trainings für die Polizisten"], ["Trainings für die Militär"], ["Trainings für das Polizei"], ["Trainings für das Polizisten"], ["Trainings für das Militär"], ["Trainingseinheit für die Polizei"], ["Trainingseinheit für die Polizisten"], ["Trainingseinheit für die Militär"], ["Trainingseinheit für das Polizei"], ["Trainingseinheit für das Polizisten"], ["Trainingseinheit für das Militär"], ["Trainingseinheiten für die Polizei"], ["Trainingseinheiten für die Polizisten"], ["Trainingseinheiten für die Militär"], ["Trainingseinheiten für das Polizei"], ["Trainingseinheiten für das Polizisten"], ["Trainingseinheiten für das Militär"] ]
当前尝试代码
let ar = [ ["Training", "für", "die", "Polizei"], ["Trainings", "", "das", "Polizisten"], ["Trainingseinheit", "", "", "Militär"] ] let indexes = [0, 1, 2, 3];//Dynamically built, so the order and length may change let separators = [' ', ' ', ' ', ' ']; let result = []; indexes.forEach(function(index) { for (let a = 0; a < ar.length; a++) { let word = ar[a][0]; for (let r = index; r < ar[a].length; r++) { let sentence = []; let words = ar[a][index]; sentence.push(word, words) if (sentence.length > 0 && sentence < 11) { const res = sentence.reduce((a, s, i) => a + separators[i - 1] + s) result.push([res]) } } } }) console.log(JSON.stringify(result))
解决方案
观察预期结果可知,需要生成以下几个维度词的笛卡尔积组合:
- 第一列词(含
Trainingseinheit的复数形式Trainingseinheiten) - 固定连接词
für - 第三列非空词(
die、das) - 第四列所有词(
Polizei、Polizisten、Militär)
直接通过嵌套循环生成所有组合即可:
let ar = [ ["Training", "für", "die", "Polizei"], ["Trainings", "", "das", "Polizisten"], ["Trainingseinheit", "", "", "Militär"] ] // 整理各维度候选词 const firstWords = ar.map(item => item[0]).concat('Trainingseinheiten'); const connector = 'für'; const middleWords = ar.map(item => item[2]).filter(word => word); const lastWords = ar.map(item => item[3]); const result = []; // 生成所有组合 firstWords.forEach(first => { middleWords.forEach(middle => { lastWords.forEach(last => { const sentence = `${first} ${connector} ${middle} ${last}`; result.push([sentence]); }); }); }); console.log(JSON.stringify(result, null, 2));
代码说明
- 先提取并整理出所有需要的候选词集合,确保覆盖预期结果中的所有元素
- 通过三层嵌套遍历所有可能的词组合,拼接成完整语句
- 将每个语句包裹在数组中,加入结果集合,最终得到符合要求的结构
如果需要适配动态变化的indexes(列顺序/长度可变),可调整候选词的提取逻辑,基于indexes指定的列来收集对应位置的非空词,当前代码已精准匹配需求中的预期结果。
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

