![](/img/trans.png)
[英]Is there a more efficient way to sort an Array in an Array in an Object?
[英]Is there a more efficient way to sort this array?
所以我有一系列特定用戶的邀請(他從其他用戶那里收到的邀請)。 我希望前端按狀態對這些邀請進行排序。 4 個可能的類別,已過期、已完成、已接受和待處理。 邀請作為對象從數據庫中獲取。 這就是我對它們進行排序的方式。 數組partArray
包括所有邀請,需要分類為acceptedArr
、 expiredArr
、 completedArr
和pendingArr
。
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);
}
}
}
如您所見,為了將邀請分類到 acceptedArr 中,它需要滿足 2 個條件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);
我會避免將數組分成 4 個類別,而是使用array.sort
。
這是示例數據的實現。
const auth = { uid: 'test' } const partarray = [{ userStats: { test: 1 }, inviteStat: 1 }, { userStats: { test: -1 }, inviteStat: 0 }, { userStats: { test: 0 }, inviteStat: 1 }, { userStats: { test: 1 }, inviteStat: 2 } ] const evaluateOrder = ({ userStats, inviteStat }) => { // lower value - higher ranking if (userStats[auth.uid] === 1 && inviteStat === 1) return 1; if (userStats[auth.uid] === -1 && inviteStat === 0) return 2; if (userStats[auth.uid] === 0 && inviteStat === 1) return 3; if (inviteStat === 2) return 4; } const sortUsers = (array) => { array.sort((prev, next) => { const prevOrder = evaluateOrder(prev); const nextOrder = evaluateOrder(next); return prevOrder - nextOrder; }) return array; } console.log(sortUsers(partarray))
不確定我是否理解你想要做什么。 不過,您可以使用 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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.