如何在JavaScript中根据嵌套值过滤数组并仅保留目标嵌套元素
解决方案:精准过滤嵌套数组中的指定元素
你的问题在于,filter配合some确实能帮你找出包含活跃玩家的国家,但它不会帮你清理掉那些无关的游戏和非活跃玩家——它只是原封不动地保留了整个国家对象的结构。要实现你想要的精准过滤,我们需要逐层处理嵌套结构,每一层都只保留符合条件的元素。
完整实现代码
const arrayData = [ { country: "Country X", games: [ { gameTitle: 'Game1', players: [{ name: 'John', status:'Active' },{ name: 'Rob', status:'Suspended' }] }, { gameTitle: 'Game2', players: [{ name: 'Saly', status:'Blocked' }] }, ] }, { country: "Country Y", games: [ { gameTitle: 'Game1', players: [{ name: 'Sindy', status:'Pending' },{ name: 'someone', status:'Rejected' }] }, { gameTitle: 'Game2', players: [{ name: 'Alex', status:'New' },{ name: 'Nic', status:'Old' }] }, ] }, ]; const output = arrayData .map(country => { // 第一步:处理每个国家的游戏列表 const filteredGames = country.games .map(game => { // 过滤当前游戏中status为Active的玩家 const activePlayers = game.players.filter(player => player.status === 'Active'); // 只有当该游戏存在活跃玩家时,才保留这个游戏(并更新players数组) return activePlayers.length > 0 ? { ...game, players: activePlayers } : null; }) // 去掉没有活跃玩家的游戏项 .filter(game => game !== null); // 第二步:只有当该国家存在符合条件的游戏时,才保留这个国家对象 return filteredGames.length > 0 ? { ...country, games: filteredGames } : null; }) // 去掉没有符合条件游戏的国家 .filter(country => country !== null); console.log(output);
代码逻辑说明
我们通过三层过滤/映射来实现精准筛选:
- 玩家层过滤:对每个游戏的
players数组,只保留status === 'Active'的玩家 - 游戏层过滤:只保留那些包含活跃玩家的游戏(过滤掉没有符合条件玩家的游戏)
- 国家层过滤:只保留那些包含符合条件游戏的国家(过滤掉没有符合条件游戏的国家)
运行结果
执行上述代码后,你会得到完全符合预期的结果:
[ { "country": "Country X", "games": [ { "gameTitle": "Game1", "players": [{"name": "John", "status": "Active"}] } ] } ]
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

