请教如何实现过滤数组中active为true且search_rank不为null的玩家对象
请教如何实现过滤数组中active为true且search_rank不为null的玩家对象
嘿,我看了你的代码,发现几个小问题导致过滤没生效,咱们一步步来调整:
首先,你当前的filter回调里没有返回判断条件!原来的写法(player: any) => {player.search_rank !== null}用了大括号,但没写return,这个回调会默认返回undefined,相当于所有元素都被过滤掉了,这肯定不对~
另外,这里完全不需要用Promise.all和await哦!因为filter是同步操作,你已经通过await fetchData拿到了所有玩家数据,后续的数组处理都是同步的,用异步方法反而会出问题。
还有,你需要同时满足两个条件:active为true,且search_rank不为null,咱们把这两个条件合并到filter里就行。
给你修正后的完整代码:
const getPlayerData = async () => { const allPlayers = await fetchData("https://api.sleeper.app/v1/players/nfl"); // 用Object.values直接转成数组,比keys+map的写法更简洁 const players = Object.values(allPlayers); // 先过滤:同时满足active为true,且search_rank不为null const activePlayers = players .filter((player: any) => { // 这里必须return判断结果,或者用箭头函数简写去掉大括号 return player.active === true && player.search_rank !== null; }) // 先过滤再排序,能减少排序的元素数量,效率更高 .sort((a, b) => a.search_rank - b.search_rank); console.log(activePlayers); return activePlayers; };
如果觉得filter的回调写大括号麻烦,还可以用箭头函数的简写形式(去掉大括号后会自动返回表达式结果):
.filter((player: any) => player.active && player.search_rank !== null)
这里因为player.active本身是布尔值,直接写player.active和player.active === true效果是一样的,看你个人习惯哪种写法~
最后再提醒下:要确保player.search_rank的类型要么是数字要么是null,如果存在undefined的情况,可能还要加上player.search_rank !== undefined,不过根据你说的用player.active = true能正常过滤,应该数据结构是没问题的。
备注:内容来源于stack exchange,提问作者D_chez12
相关产品推荐
相关产品推荐

