代码之家  ›  专栏  ›  技术社区  ›  547n00n

如何循环遍历集合并返回与查询参数对应的项

  •  0
  • 547n00n  · 技术社区  · 5 年前

    我正在使用nodeJS进行一些查询,以从JSON文件中检索自定义数据,我想从这个集合中返回玩得最多的游戏(玩得最多的游戏是用户之间总玩时间最高的游戏)

    以下是JSON:

    {
        "data": [
            {
                "userId": 8,
                "game": "League of legends",
                "playTime": 500,
                "genre": "MOBA",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "World of warcraft",
                "playTime": 1500,
                "genre": "MMORPG",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 88,
                "game": "Dark Souls",
                "playTime": 109,
                "genre": "Action RPG",
                "platforms": [
                    "PS3",
                    "Xbox 360",
                    "PC",
                    "PS4",
                    "Xbox One",
                    "Nintendo Switch"
                ]
            },
            {
                "userId": 88,
                "game": "The Witcher 3: Wild Hunt",
                "playTime": 9,
                "genre": "RPG",
                "platforms": [
                    "PC",
                    "PS4",
                    "Xbox One",
                    "Nintendo Switch"
                ]
            },
            {
                "userId": 1,
                "game": "The last of us 2",
                "playTime": 100,
                "genre": "FPS",
                "platforms": [
                    "PS4",
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "Hitman 3",
                "playTime": 60,
                "genre": "Stealth",
                "platforms": [
                    "PS4",
                    "PS5",
                    "Xbox One",
                    "Nintendo Switch",
                    "PC"
                ]
            },
            {
                "userId": 99,
                "game": "Minecraft",
                "playTime": 1002,
                "genre": "Sandbox",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "Hearthstone",
                "playTime": 1000,
                "genre": "Card Game",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "FIFA",
                "playTime": 2000,
                "genre": "Sport",
                "platforms": [
                    "PC",
                    "PS4",
                    "Xbox One"
                ]
            },
            {
                "userId": 2,
                "game": "The Witcher 3: Wild Hunt",
                "playTime": 78,
                "genre": "RPG",
                "platforms": [
                    "PC",
                    "PS4",
                    "Xbox One",
                    "Nintendo Switch"
                ]
            },
            {
                "userId": 47,
                "game": "League of legends",
                "playTime": 850,
                "genre": "MOBA",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 2,
                "game": "Among Us",
                "playTime": 5000,
                "genre": "Multiplayer",
                "platforms": [
                    "PC",
                    "Android"
                ]
            },
            {
                "userId": 2,
                "game": "Valorant",
                "playTime": 2000,
                "genre": "FPS",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 9,
                "game": "Valorant",
                "playTime": 80,
                "genre": "FPS",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 9,
                "game": "Dark Souls",
                "playTime": 109,
                "genre": "RPG",
                "platforms": [
                    "PS3",
                    "Xbox 360",
                    "PC",
                    "PS4",
                    "Xbox One",
                    "Nintendo Switch"
                ]
            },
            {
                "userId": 9,
                "game": "The Witcher 3: Wild Hunt",
                "playTime": 900,
                "genre": "RPG",
                "platforms": [
                    "PC",
                    "PS4",
                    "Xbox One",
                    "Nintendo Switch"
                ]
            },
            {
                "userId": 24,
                "game": "League of legends",
                "playTime": 300,
                "genre": "MOBA",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 24,
                "game": "World of warcraft",
                "playTime": 800,
                "genre": "MMORPG",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 54,
                "game": "Minecraft",
                "playTime": 231,
                "genre": "Sandbox",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "Minecraft",
                "playTime": 777,
                "genre": "Sandbox",
                "platforms": [
                    "PC"
                ]
            },
            {
                "userId": 7,
                "game": "Hitman 3",
                "playTime": 90,
                "genre": "Stealth",
                "platforms": [
                    "PS4",
                    "PS5",
                    "Xbox One",
                    "Nintendo Switch",
                    "PC"
                ]
            }
        ]
    }
    

    我已经通过编写以下函数来完成此操作:

    const selectTopByPlaytime = async (options) => {
        return _.chain(games)
            .groupBy('game')
            .map((value, key) => {
                return {
                    'game': key,
                    'playTime': _.reduce(value, function (memo, i) { return memo + i.playTime; }, 0),
                    'genre': value[0].genre,
                    'platforms': value[0].platforms,
                };
            })
            .sortBy((i) => { return -i.playTime; })
            .first(5).value()
    
    }
    

    我试图通过添加queryparams过滤器来修改这个函数,以按播放时间返回发送参数后可用的顶级游戏。

    示例:基本URL/按播放时间选择顶部?流派=FPS将按播放时间返回按FPS流派分类的顶级游戏。

    请帮忙!

    0 回复  |  直到 5 年前
        1
  •  0
  •   Milad Raeisi    5 年前

    首先获取查询参数,然后根据其类型进行过滤。

    const selectTopByPlaytime = async (options) => {
      let queryParams = new URLSearchParams(window.location.search);
      return _.chain(games)
        .groupBy("game")
        .filter((item) => {
          for ([key, value] of queryParams.entries()) {
            switch (key) {
              case "genre":
                if (item.genre != value) return false;
              case "platform":
                if (item.platforms.indexOf(value) == -1) return false;
            }
          }
          return true;
        })
        .map((value, key) => {
          return {
            game: key,
            playTime: _.reduce(
              value,
              function (memo, i) {
                return memo + i.playTime;
              },
              0
            ),
            genre: value[0].genre,
            platforms: value[0].platforms,
          };
        })
        .sortBy((i) => {
          return -i.playTime;
        })
        .first(5)
        .value();
    };
    
    推荐文章