Javascript 有没有更有效的方法来排序此数组?
所以我有一个特定用户的邀请数组(他从其他用户那里收到的邀请)。我想让前端按状态对这些邀请进行排序。4种可能的类别,过期、已完成、已接受和待定。邀请作为对象从数据库中获取。我就是这样分类的。数组Javascript 有没有更有效的方法来排序此数组?,javascript,reactjs,Javascript,Reactjs,所以我有一个特定用户的邀请数组(他从其他用户那里收到的邀请)。我想让前端按状态对这些邀请进行排序。4种可能的类别,过期、已完成、已接受和待定。邀请作为对象从数据库中获取。我就是这样分类的。数组partArray包含所有邀请,需要按acceptedArr、expiredArr、completedArr和pendingar进行排序 for(let j = partarray.length-1;j>=0;j--){ if(partarray[j].userStats[
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。查看更新的答案。我意识到拆分不是一个理想的解决方案。非常感谢您的回答,我一定会努力优化这个过程,当我这样做时,我会参考您的答案。