javascript 进行组合,C(M,1),m数量是不确定的,应该如何解决?

题目描述

我看到其他人提到一个问题,还有下边的答案,感觉非常有兴趣,就把题目改编了

题目来源及自己的思路

题目原本是这样的,`var wordList = [

[{'热烈'}, {'万分'}, {'非常'}, ''],
[{'欢迎'}, {'感谢'}, {'谢谢'}],
[{'您'}, {'亲'}, {'老板'}, {'大神'}, ''],
[{'光临'}, {'惠顾'}, {'支持'}],
[{'小店'}, {'本店'}, {'火女菜馆'}]

];`

你期待的结果是什么?

如何把这个全都组合起来呢,相同行的不能组成一个,比如:热烈 感谢 老板 支持 小店(每行取一个)这是正确的。

但是热烈 万分 谢谢 大神 支持,这样是错误的

每次要提取的数量m,是不一定的,比如m=5,就是热烈 感谢 老板 支持 小店
m=4,就是 热烈 感谢 老板 支持

热烈 感谢 老板 小店
热烈 老板 支持 小店
感谢 老板 支持 小店

这样的,当然还有很多种,都没有一一列出来,这种计算应该如何达成呢?

组成的应该是这样的:[{'热烈'},{'感谢'},{'老板'},{'支持'},{'小店'}]
阅读 2.5k
3 个回答
let wordList = [
    ['热烈', '万分', '非常'],
    ['欢迎', '感谢', '谢谢'],
    ['您', '亲', '老板', '大神'],
    ['光临', '惠顾', '支持'],
    ['小店', '本店', '火女菜馆']
];

let M = 4;

/** @example cross([[1]], [2,3]) // [[1,2], [1,3]] */
let cross = (a1, a2) => a1.reduce((r, s1) => r.concat(a2.map(s2 => [...s1, s2])), []);
//还可以这么写
//let cross = (a1, a2) => [].concat(...a1.map(s1 => a2.map(s2 => [...s1, s2])));

let result = wordList.slice(0, M).reduce(cross, [[]]);

//回答追问

let wordList=[
    {"name":"热烈","id":1},{"name":"万分","id":2},{"name":"非常","id":3},
    {"name":"欢迎","id":1},{"name":"感谢","id":2},{"name":"谢谢","id":3},
    {"name":"您","id":2},{"name":"亲","id":1},{"name":"大神","id":1}]
    
wordList = wordList.reduce((r, o)=>(r[o.id-1]=(r[o.id-1]||[]).concat(o.name),r),[]);

//然后按之前的步骤解决
import * as _ from 'lodash';
var wordList = [
    ['热烈', '万分', '非常'],
    ['欢迎', '感谢', '谢谢'],
    ['您', '亲', '老板', '大神'],
    ['光临', '惠顾', '支持'],
    ['小店', '本店', '火女菜馆']
];
var sentence=_.map(wordList,_.sample).join('');

改成这样该如何做:

let wordList=[
{"name":"热烈","id":1},{"name":"万分","id":2},{"name":"非常","id":3},
{"name":"欢迎","id":1},{"name":"感谢","id":2},{"name":"谢谢","id":3},
{"name":"您","id":2},{"name":"亲","id":1},{"name":"大神","id"1}
]

id相同的不能组合为一组,共有多少种组合的方式,同样M是不确定的,从这些组种选择M个想组合,该如何代码

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题