Javascript 按顺序从具有非唯一性的列表中获取唯一组合
我有一个问题,我就是无法解决,我希望有人能帮我解决 想象一下以下情况: 有一个名单上的人都有一个名字。所以每个人都是一个具有“name”属性的对象。从该列表中,以随机顺序选择随机数目的人(因此并非所有人都始终在选择中),并且每个人只被选择一次。但是,姓名可能不是唯一的:列表中可能有多个姓名为“Smith”的人。在本例中,让我们假设每个名称只是字母表中的一个字母。因此,我可能会收到以下选择: [V,C,R,C,F,X,R,C] 下一次的选择可能会完全不同。该选择中的每个元素都是不同的人,但有些名称出现多次 让我们添加数字来澄清:Javascript 按顺序从具有非唯一性的列表中获取唯一组合,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,我有一个问题,我就是无法解决,我希望有人能帮我解决 想象一下以下情况: 有一个名单上的人都有一个名字。所以每个人都是一个具有“name”属性的对象。从该列表中,以随机顺序选择随机数目的人(因此并非所有人都始终在选择中),并且每个人只被选择一次。但是,姓名可能不是唯一的:列表中可能有多个姓名为“Smith”的人。在本例中,让我们假设每个名称只是字母表中的一个字母。因此,我可能会收到以下选择: [V,C,R,C,F,X,R,C] 下一次的选择可能会完全不同。该选择中的每个元素都是不同的人,但有些名称
[V, C1, R1, C2, F, X, R2, C3]
现在我需要所有可能的人的组合,每个人的名字只出现一次,但要遵循他们在选择中列出的顺序。所选内容中的每个唯一名称都应包含在组合中。例如,在这种情况下,我需要:
[V, C1, R1, F, X],
[V, R1, C2, F, X],
[V, R1, F, X, C3],
[V, C1, F, X, R2],
[V, C2, F, X, R2]
...
等等。人们的立场不应该改变(即,[C1,V,…]不可以,因为“V”不应该在“C1”之后)
我想我需要递归性和一些方法来跟踪名字,但这就是我的大脑开始融化的地方我发现脚本可以以任何顺序获得所有可能的排列,但没有这样的
有人能帮我吗
谢谢 您可以采用一种组合算法,该算法将一个项目(在检查临时结果集中是否没有相同的第一个字母后)作为结果集,然后继续下一个索引,直到找到所需的长度或没有更多的项目可用
函数组合(数组、大小){
功能叉(i,t){
如果(t.length==大小){
结果:推(t);
返回;
}
if(i==array.length){
返回;
}
如果(!t.some(([c])=>c==数组[i][0])){
叉(i+1,t.concat([array[i]]);
}
叉(i+1,t);
}
var结果=[];
fork(0,[]);
返回结果;
}
风险值数据=['V','C1','R1','C2','F','X','R2','C3'],
结果=获取组合(数据,5);
log(result.map(a=>a.join(“”))代码>这里有一个简单的非递归算法
list=['V','C1','R1','C2','F','X','R2','C3']//
//构建一个索引项=>它的位置
//(在您的案例中,项[0]==项.name)
让索引=新地图;
for(让list.entries()的[i,item]
index.set(项[0],(index.get(项[0])| |新集).add(i));
//从一个组合开始,它是初始列表
让combs=[list];
//对于每个项目及其位置。。。
for(让[项目,是]为索引){
//生成一组新的组合
设combs2=[];
//对于每个职位。。。
因为(让我来谈谈){
//此项目的所有位置,当前位置除外
让toRemove=新集合([…is]);
删除第(i)款;
//对于所有组合。。。
用于(让c为梳子){
//在这些位置插入null
combs2.push(c.map((x,j)=>toRemove.has(j)?null:x));
}
}
//继续使用新的组合集
梳=梳2;
}
//一旦我们准备好删除所有空值
combs=combs.map(c=>c.filter(x=>x!==null))
//完成
用于(让c为梳子)
console.log(c.join())
抱歉等待。我稍微调整了一下,但这个效果很好。谢谢