JavaScript中的即时决选投票和附加投票

JavaScript中的即时决选投票和附加投票,javascript,voting,voting-system,Javascript,Voting,Voting System,我试图用JavaScript实现IRV,但我每5秒只获得10对投票(仅用于开发测试),因此每次新的一对投票到达客户端时都添加到数组中是不切实际的。因此,我想知道是否有任何方法可以在接收数据时处理数据,并与将要接收的新数据保持一致 const候选者=['candidate1','candidate2','candidate3']; //我将在5秒后收到更多的选票(或在prod中的任何投票),这将取代这个 让我们投票=['candidate1'、'candidate3'、'candidate2'],

我试图用JavaScript实现IRV,但我每5秒只获得10对投票(仅用于开发测试),因此每次新的一对投票到达客户端时都添加到数组中是不切实际的。因此,我想知道是否有任何方法可以在接收数据时处理数据,并与将要接收的新数据保持一致

const候选者=['candidate1','candidate2','candidate3'];
//我将在5秒后收到更多的选票(或在prod中的任何投票),这将取代这个
让我们投票=['candidate1'、'candidate3'、'candidate2'],
['candidate2'、'candidate1'、'candidate3']/*等*/];
//我想计算一下当时的获胜者
//但5秒后,阵列将无法获得之前的投票
我在问当时是否有计算IRV Winner的算法,知道几秒钟后之前的值就消失了,这使得无法以正常方式计算

我们有没有办法根据他们的位置给他们加分,这样就可以增加分数,并且仍然获得冠军

这是我想出来的,但它没有发挥应有的作用。但这会让你知道我需要什么

//基本投票(演示仅一个)
让投票=['candidate1'、'candidate3'、'candidate2']];
//存储每个候选人的排名
让排名=[0,0,0];
//计算IRV
函数irv(){
投票。forEach(投票=>{
让分数=投票长度;
投票。forEach((候选人,i)=>{
排名[i]+=分;
点--;
});
});
}
//计算当时的获胜者
irv();
//增加新的选票
票数=[['candidate2','candidate1','candidate3']];
//重新计算获胜者
irv();
//向获胜者展示
console.log(排名)以下是一个(可能过于简单的)实现:

const irv=(选票)=>{
常量候选人=[…新集合(ballots.flat())]
常量选票=对象条目(选票减少)(
(投票,[v])=>{投票[v]+=1;返回投票},
Object.assign(…candidates.map(c=>({[c]:0})))
))
常数[topCand,topCount]=
选票减少(([n,m],[v,c])=>c>m?[v,c]:[n,m],“?”,-Infinity])
常数[bottomCand,bottomCount]=
选票减少(([n,m],[v,c])=>c选票。长度/2
?托普坎德
:irv(ballots.map(ballot=>ballot.filter(c=>c!=bottomCand)).filter(b=>b.length>0))
}
常量选票=[
[A',C',B',E',D'],
[B',D',A',F',G'],
[C]、[B]、[D],
[B',D',E',A',H'],
[A',B',G',H',F'],
[G',E',B',H',D'],
[E',C',D',B',G'],
['A','B'],
['D','G'],
[F','E','C'],
[F',C',G',A',E'],
[B',C',G',A',E'],
[A',B',F',G'],
]

console.log(irv(选票))
您不能继续将新的选票添加到一个运行总数中吗?我认为你不可能有一个有效的计分系统。你需要实际的选票来运行IRV。积分会丢失太多信息。IRV应该按照投票*候选人的顺序进行操作,即使是数百万张选票和十几名候选人也不应该花费太长时间。但是我认为你需要保留所有的选票。