javascript中的队列逻辑

javascript中的队列逻辑,javascript,Javascript,你好,我想创建一个队列 例如,单击一个按钮,我将检查整个队列,在满足任何条件的情况下,我将选择两名玩家,然后从该队列中删除该玩家并创建一名(匹配) 但是我想知道我是否遵循了正确的逻辑,这个类结构是否是最好的,或者我是否用示例对象创建了一个常量 const game={queue:{},player:{},match:{} 当一个条件满足并且不是空的时候,我如何从这个队列中提取两个元素 我的班级队列: class Queue { constructor() {

你好,我想创建一个队列

例如,单击一个按钮,我将检查整个队列,在满足任何条件的情况下,我将选择两名玩家,然后从该队列中删除该玩家并创建一名(匹配)

但是我想知道我是否遵循了正确的逻辑,这个类结构是否是最好的,或者我是否用示例对象创建了一个常量

const game={queue:{},player:{},match:{}

当一个条件满足并且不是空的时候,我如何从这个队列中提取两个元素

我的班级队列:

class Queue 
{ 

    constructor() 
    { 
        this.queue = []; 
    } 

    isEmpty() 
    { 
        return this.queue.length == 0; 
    }
    addPlayer(player){
        this.queue.push(player); 
    }
    getAll(){
        return this.queue;
    }
} 
我的班级经理

const Queue = require('./Queue');
class QueueManager
{ 

    constructor() 
    { 
        this.queue = [];
    } 

    createQueue(){
        this.queue.push(new Queue());
    }
    addPlayerQueue(player){
        this.queue.addPlayer(player); 
    }
} 
我的班级球员:

const player = require('../models/User');

const socketId = null

class Player {
    constructor({socket,player}) {
        socketId = socket.socket.id
        this.id = player.id;
        this.name = player.name;
    }

}

module.exports = Player;

我以前没有做过类似于
队列
系统的事情,但这就是我想到的。其思想是有一个
队列
,该队列存储当前挂起的
玩家数组
,以及一个
匹配
对象,该对象存储单个
匹配
id作为其键,匹配的玩家作为其值。当然,这也可以是一个数组

这只是一个粗略的想法,您需要修改以满足您的需要

如果没有为类(Player)定义内部方法,则可能不需要某些类,但无论如何,我都使用类

const uuid=require(“uuid”);
/*
//概念:
//一系列悬而未决的玩家
常量队列=[
{
id:“玩家1”,
姓名:“玩家1”
},
{
id:“玩家2”,
姓名:“玩家2”
}
];
//当前匹配项,id为匹配项的键
常量匹配={
“匹配-001”:[
{
…玩家
}
]
};
*/
//球员级别
职业选手{
构造函数(id、名称){
this.id=id;
this.name=名称;
}
//玩家休息方法。。。
//例如:更新名称。。。
}
//Matches类是匹配项的集合
班级比赛{
构造函数(){
this.matches={};
}
addMatch(匹配){
this.matches[match.id]=匹配;
}
//匹配rest方法。。。
}
//Match类是单个游戏的Match结构
班级比赛{
建造师(球员){
this.id=uuid.v4().toString();
这个。玩家=玩家;
}
//匹配rest方法。。。
//即:isMatchEnded,IsMatchStart。。。
}
//队列类是一个包含玩家的队列系统。
类队列{
构造函数(){
这个.players=[];
}
//添加玩家将多个玩家添加到队列中
添加玩家(玩家){
this.players=this.players.concat(players);
}
//addPlayer将单个播放机添加到队列中
addPlayer(播放器){
这个。玩家。推(玩家);
}
//移除玩家从队列中移除多个玩家
移除玩家(玩家){
players.forEach(p=>{
这个.removePlayer(p);
});
}
//removePlayer从队列中删除单个播放机
移除玩家(玩家){

const index=this.players.findIndex(p=>p.id==player.id); 如果(索引>-1){ 这个.players.splice(索引-1); } } //GetPlayer返回当前在队列中的播放机 getPlayers(){ 归还这个。玩家; } //makeMatch与提供的条件匹配并删除 //从队列中匹配玩家 makeMatch(条件){ //结对 const matchedPlayers=this.players.filter(条件); //从该列表中删除匹配的玩家。玩家 这个。移除玩家(匹配玩家); //用匹配的玩家返回新的比赛 返回新的比赛(已匹配的球员); } } //初始化队列 const queue=新队列(); //初始化匹配项, //对象,匹配id为键,匹配的玩家为值 常量匹配=新匹配(); //添加模拟玩家 for(设i=1;i idx%2==0); //将创建的匹配项添加到matches类中 匹配。添加匹配(匹配);
你是想创造一种类似配对的行为吗?@dev Junwen yess是的,我是在尝试,但我在使用类甚至常量时有点困难。基本上,所有玩家都在一行中,我将创建一种方法,在满足条件时,将两名玩家移出该行(然后移除),然后把这两个玩家送到一个班级“比赛”。你是用Node.js还是React?@dev_junwen Node.js我用nodejs来支持socket.io并对front做出反应谢谢兄弟,我相信有了这个我可以做我想象的事情,你能问我一个问题吗?您是否使用u.id为匹配id生成随机数?如果我在数据库中有一个匹配id的表,你不需要这个.id吗?或者我最好将此id保存到数据库中?我使用uuid作为匹配id。您可以使用xid或其他任何方法。这只是一个非常简单的概念,您可能需要修改某些内容以满足您的需要。例如,您可能需要将
makeMatch
函数变成一个承诺,因为您不会总是得到一个完美的匹配,这意味着您的配对可能会失败,因为队列中当前没有符合您提供的条件的玩家。Oops bro I在使用该条件创建匹配时,调整代码意识到了一些问题,即没有删除满足当前列表条件的玩家。我在codeconst索引中未发现任何错误=this.players.findIndex(p=>p.id==player.id);如果(索引>-1){this.players.splice(索引,-1);}我进行了编码,以便列表将根据其ID删除播放机。匹配的播放机是否具有字段
ID
?你的比赛条件是什么?