有一个游戏目录,其中的游戏列表经过多个过滤器。
游戏按平台划分(HTC、PSVR、PS5、Favorites),当你点击选项卡时,会触发一个计算属性,对于 PS5 来说是 showPS5Games,它接受选择的流派(genre)、排序(selectedSort) )、复选框“适合儿童”(isChild)、复选框“适合两个”(isLocalMultiplayer) 以及按名称/标签/流派搜索游戏(查询)。所有参数都可以以任何方式组合。
showPS5Games 的完整代码:
showPS5Games: state => ( query, genre, isChild, isLocalMultiplayer, selectedSort ) => { if (genre == "все" && isChild && isLocalMultiplayer) { var tmpArray = state.games.filter(game => { return ( (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.title.toLowerCase().includes(query)) || (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.genre.includes(query)) || (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.tag.includes(query)) ); }); } else if (isChild && isLocalMultiplayer) { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && isChild && game.isLocalMultiplayer && game.genre === genre && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && isChild && game.isLocalMultiplayer && game.genre === genre && game.genre.includes(query)) || (game.category === "ps5" && isChild && game.isLocalMultiplayer && game.genre === genre && game.tag.includes(query)) ); }); } else if (genre === "все" && isChild) { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.isChild && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.isChild && game.genre.includes(query)) || (game.category === "ps5" && game.isChild && game.tag.includes(query)) ); }); } else if (isChild) { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.isChild && game.genre === genre && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.isChild && game.genre === genre && game.genre.includes(query)) || (game.category === "ps5" && game.isChild && game.genre === genre && game.tag.includes(query)) ); }); } else if (genre === "все" && isLocalMultiplayer) { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.isLocalMultiplayer && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.isLocalMultiplayer && game.genre.includes(query)) || (game.category === "ps5" && game.isLocalMultiplayer && game.tag.includes(query)) ); }); } else if (isLocalMultiplayer) { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.isLocalMultiplayer && game.genre === genre && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.isLocalMultiplayer && game.genre === genre && game.genre.includes(query)) || (game.category === "ps5" && game.isLocalMultiplayer && game.genre === genre && game.tag.includes(query)) ); }); } else if (genre === "все") { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.genre.includes(query)) || (game.category === "ps5" && game.tag.includes(query)) ); }); } else { var tmpArray = state.games.filter(game => { return ( (game.category === "ps5" && game.genre === genre && game.title.toLowerCase().includes(query)) || (game.category === "ps5" && game.genre === genre && game.genre.includes(query)) || (game.category === "ps5" && game.genre === genre && game.tag.includes(query)) ); }); } var filteredGames = []; if (selectedSort == "ascending") { filteredGames = tmpArray.sort((a, b) => a.title.localeCompare(b.title)); } else if (selectedSort == "descending") { filteredGames = tmpArray.sort((a, b) => b.title.localeCompare(a.title)); } else if (selectedSort == "bygenre") { filteredGames = tmpArray.sort((a, b) => a.genre.localeCompare(b.genre)); } else if (selectedSort == "bytag") { filteredGames = tmpArray.sort((a, b) => a.tag.localeCompare(b.tag)); } else { filteredGames = tmpArray; } return filteredGames; }
我为每种可能的组合编写了一个带有许多 if 的分支函数,该函数没有经过优化,也不美观。此外,由于某种原因,通过两个选定的复选框过滤数组不起作用,只有一个可以正常工作。重写它的最佳方法是什么?
P粉1547981962024-01-17 16:11:35
这里有很多重复的逻辑。提高效率的第一步是清理 if 语句。例如你有:
if (genre == "все" && isChild && isLocalMultiplayer) { ... } else if (isChild && isLocalMultiplayer) {
其中一些条件可以使用嵌套 if 检查一次:
if (isChild && isLocalMultiplayer) { if (genre == "все" { ... } }
此外,出于同样的原因,还可以简化退货。例如这个返回
return ( (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.title.toLowerCase().includes(query)) || (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.genre.includes(query)) || (game.category == "ps5" && isChild && game.isLocalMultiplayer && game.tag.includes(query)) );
可以简化为:
return ( game.category == "ps5" && isChild && game.isLocalMultiplayer && (game.title.toLowerCase().includes(query) || game.genre.includes(query) || game.tag.includes(query)) );
我希望这能帮助您弄清楚您在这里遇到的其他问题,祝您好运!