как прочитать файл json и выполнить поиск с помощью фильтра для общих элементов в nodejs

#node.js #arrays #json #object #search

Вопрос:

У меня есть файл JSON, содержащий игровые объекты, я хочу получить топ-5 игр с наибольшим общим временем воспроизведения между пользователями.

Я попытался получить все объекты, прочитав файл с помощью файловой системы в nodejs :

 const queryGames = async () => {
    let data = fs.readFileSync(path.resolve(__dirname, '../../games.json'))
    let games = JSON.parse(data)
    return games
}

/**
 * Query for top games by play time
 * @returns {Promise<QueryResult>}
 */
const selectTopByPlaytime = async () => {

}
 

это файл json : https://jsoneditoronline.org/#left=cloud.3b82169327044c04b7207fa186aee85bamp;right=local.tiniqu

Комментарии:

1. Ты пытался что-то сделать ?

2. @RaphaelPICCOLO Я не уверен, какой метод или алгоритм мне следует использовать

Ответ №1:

что-то вроде этого должно сработать.

 const gamePlayData = require('./gamePlay.json').data

/**
 * Query for games and time
 * @returns {
      'League of legends': 1650,
      'World of warcraft': 2300,
      'Dark Souls': 218,
      'The Witcher 3: Wild Hunt': 987,
      etc....
    }
 */
const getGamePlayTimes = () => {
    gamePlayTimes = {}
    gamePlayData.forEach( (playData) => {
        const gameName = playData.game
        if(gamePlayTimes[gameName]) {
            gamePlayTimes[gameName]  = playData.playTime
        }
        else {
            gamePlayTimes[gameName] = playData.playTime
        }
    })
    return gamePlayTimes;
}

const getGamesAndTimesAsList = (playTimes) => {
    let gamesWithTimeArr = [];
    let i = 0;
    for(let game in playTimes) {
        let gameAndPlayTime = {game: "", playTime: 0};
        gameAndPlayTime.game = game;
        gameAndPlayTime.playTime = playTimes[game];
        gamesWithTimeArr[i  ] = gameAndPlayTime
    }
    return gamesWithTimeArr;
}


const  reverseBubbleSort = (a, par) => {
let swapped;
do {
    swapped = false;
    for (var i = 0; i < a.length - 1; i  ) {
        if (a[i][par] < a[i   1][par]) {
            var temp = a[i];
            a[i] = a[i   1];
            a[i   1] = temp;
            swapped = true;
        }
    }
  } while (swapped);

  return a;
}

sortedArr = reverseBubbleSort(getGamesAndTimesAsList( getGameAndPlayTimes() ) , 'playTime') 
const top5 = sortedArr.slice(0, 5);
console.log(top5);