Javascript 有没有更有效的方法来排序此数组?

Javascript 有没有更有效的方法来排序此数组?,javascript,reactjs,Javascript,Reactjs,所以我有一个特定用户的邀请数组(他从其他用户那里收到的邀请)。我想让前端按状态对这些邀请进行排序。4种可能的类别,过期、已完成、已接受和待定。邀请作为对象从数据库中获取。我就是这样分类的。数组partArray包含所有邀请,需要按acceptedArr、expiredArr、completedArr和pendingar进行排序 for(let j = partarray.length-1;j>=0;j--){ if(partarray[j].userStats[

所以我有一个特定用户的邀请数组(他从其他用户那里收到的邀请)。我想让前端按状态对这些邀请进行排序。4种可能的类别,过期、已完成、已接受和待定。邀请作为对象从数据库中获取。我就是这样分类的。数组
partArray
包含所有邀请,需要按
acceptedArr
expiredArr
completedArr
pendingar
进行排序

for(let j = partarray.length-1;j>=0;j--){



           if(partarray[j].userStats[auth.uid]==1 &&partarray[j].inviteStat==1){

             acceptedArr.push(partarray[j].id)
             partarray.splice(j, 1);

           }
           else if(partarray[j].userStats[auth.uid]==-1||partarray[j].inviteStat==0){

               expiredArr.push(partarray[j].id)
               partarray.splice(j, 1);


           }
           else if(partarray[j].userStats[auth.uid]==0&&partarray[j].inviteStat==1){

               pendingArr.push(partarray[j].id)
               partarray.splice(j, 1);


           }else if(partarray[j].inviteStat==2){


               completedArr.push(partarray[j].id)
               partarray.splice(j, 1);


           }


         }



        }

如您所见,为了将invite排序到acceptedArr中,它需要满足两个条件
partarray[j]。userStats[auth.uid]==1&&partarray[j]。inviteStat==1
每个类别都有不同的条件。有没有办法以更有效的方式实现我正在做的事情?

为什么不这样过滤它们呢

const acceptedArr=partarray.filter(invite=>invite.userStats[auth.uid]==1&&invite.inviteStat==1.map(invite=>invite.id);

const completedArr=partarray.filter(invite=>invite.inviteStat==2).map(invite=>invite.id)不确定我是否理解您的意图。不过,您可以使用switch语句,并通过将常用代码移到底部,来消除大量此类代码:

for (let j = partarray.length - 1; j >= 0; j--) {

  let el = partarray[j]
  let userStats = el.userStats[auth.uid]
  let inviteStat = el.inviteStat

  switch(inviteStat){

      case 0:
          //do something
          break;

      case 1:
        if(userStats == 0){
           //do something
        } else if(userStats == 1){
           //do something
        }
        break;

      case 2:
          //do something
          break;
  }

    if (userStats == -1 ){
      //do something    
    } 

    pendingArr.push(el.id)
    partarray.splice(j, 1);
}

我会避免将数组分成4类,而是使用
array.sort

下面是带有示例数据的实现

const auth={
uid:“测试”
}
常量部分数组=[{
用户统计:{
测试:1
},
受邀者:1
},
{
用户统计:{
测试:-1
},
受邀者:0
},
{
用户统计:{
测试:0
},
受邀者:1
},
{
用户统计:{
测试:1
},
国家统计局:2
}
]
常量计算顺序=({
用户统计,
邀请者
}) => {
//低值-高排名
如果(userStats[auth.uid]==1&&
inviteStat==1)
返回1;
如果(userStats[auth.uid]=-1&&
inviteStat==0)
返回2;
如果(userStats[auth.uid]==0&&
inviteStat==1)
返回3;
if(inviteStat==2)
返回4;
}
const sortUsers=(数组)=>{
array.sort((上一个,下一个)=>{
const prevOrder=评估顺序(prev);
const nextOrder=评估顺序(下一步);
返回上一个订单-下一个订单;
})
返回数组;
}

控制台.log(SoTrAsvs:PARTAREX)您可以考虑本机数组<代码> .SoTo()/Case>方法。您需要像这样改变代码>如果您只是正常地循环使用它,而不使用它,那么它应该可以正常工作。几乎每种编程语言(或其标准库)都包含一个高效的排序方法,并且该方法的编写方式允许自定义排序条件。我原以为您是根据这四个标准对用户进行分组的。是的,但正如您在代码中看到的,我只存储invite对象中的字段“id”。有没有办法使用array.filter然后只存储“invite.id”字段?这将是理想的,但我无法做到这一点。您可以映射生成的数组以仅获取ID。查看更新的答案。我意识到拆分不是一个理想的解决方案。非常感谢您的回答,我一定会努力优化这个过程,当我这样做时,我会参考您的答案。